PRB: Longjmp Inside a _try Block Fails on PowerPC

ID: Q153005


The information in this article applies to:
  • The C/C++ Compiler (CL.EXE), included with:
    • Microsoft Visual C++ 32-bit Edition, version 4.1
      on the following platforms: PowerPC


SYMPTOMS

A program that contains a longjmp called inside a _try block may not call a _finally block. The sample code below is verified to work consistently on Alpha, MIPS and Intel platforms. It fails only on Power PC.


WORKAROUND

The solution is to include the setjmpex.h file instead of setjmp.h. The latter provides consistent behavior on all platforms, but may cause a performance degradation. Note: either setjmp.h or setjmpex.h may be included, but not both, because each defines the setjmp macro in a different way.


STATUS

This behavior is by design.


MORE INFORMATION

The on-line documentation claims the following:

"Exiting a try-finally statement using a return statement or the longjmp run-time function is considered abnormal termination. It is illegal to jump into a __try statement, but legal to jump out of one."
Consequently, a longjmp within a _try block should cause the _finally to be executed.

Sample Code


   /* Compile options needed:
   */ 

   #include <stdio.h>
   #include <stdlib.h>
   //#include <setjmpex.h>  // uncomment this line for the workaround
   #include <setjmp.h> // comment this line out for the workaround
   #include <windows.h>

   CRITICAL_SECTION    cs;
   jmp_buf             jmpbuf;

   void main()
   {
        int  i = 0, j;
        int  hits = 0;

        if(setjmp(jmpbuf))
        {
             hits += 1;
             i = 0;
             printf("\n\n Jump.....\n\n");
        }

        while(1)
        {
             for(j = 0; j < 10; j++)
                  printf("%d ", i++);
             _try
             {
                  longjmp(jmpbuf, 1);
             }
             _finally
             {
                  printf("\n\nInside finally....\n");
             }
        }
   } 

Additional query words:

Keywords : kbVC kbPowerPC
Version : winnt:
Platform : winnt
Issue type : kbprb


Last Reviewed: January 31, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.