[LLVMdev] built-in longjmp and setjmp

Eli Friedman
Wed, 13 Apr 2011 17:05:36 -0000

On Wed, Apr 13, 2011 at 9:51 AM, Akira Hatanaka <ahatanak at gmail.com>
wrote:
> It seems straightforward to implement, if it just needs to be functionally
> correct.
>
> I have another question about setjmp/longjmp. When the following program is
> compiled and run with argument 10 (./a.out 10), should it print 10 or 23? I
> am asking this question because it prints 23 when compiled with gcc and
> prints 10 when compiled with clang. If it is supposed to return 23, it
seems
> to me that saving and clobbering registers is not enough to guarantee
> correctness of the compiled program.
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <setjmp.h>
>
> jmp_buf buf;
>
> void __attribute__((noinline))
> sub2 (void)
> {
>   longjmp (buf, 1);
> }
>
> int
> main (int argc, char** argv)
> {
>   int n = atoi(argv[1]), r;
>
>   if ((r = setjmp (buf)))
>     {
>       printf("n = %d\n", n);
>       return 0;
>     }
>
>     n += 13;
>     sub2 ();
>
>   return n;
> }

Neither output is wrong.

C99 7.13.2.1p3:
All accessible objects have values, and all other components of the
abstract machine212)
have state, as of the time the longjmp function was called, except
that the values of
objects of automatic storage duration that are local to the function
containing the
invocation of the corresponding setjmp macro that do not have
volatile-qualified type
and have been changed between the setjmp invocation and longjmp call are
indeterminate.

-Eli