Eric Blake wrote: > Hmm, we'll need to backport this improved stack-direction testing to > gnulib and libsigsegv, then
This is true for gnulib's alloca.c and c-stack.c. The code in libsigsegv already contains a counter-measure against tail recursion elimination: ------------------------------------ foo.c ------------------------------------ #include <stdio.h> int get_stack_direction () { auto char dummy; static char *dummyaddr = (char *)0; if (dummyaddr != (char *)0) return &dummy > dummyaddr ? 1 : &dummy < dummyaddr ? -1 : 0; else { dummyaddr = &dummy; { int result = get_stack_direction (); /* The next assignment avoids tail recursion elimination (IRIX 6.4 CC). */ dummyaddr = (char *)0; return result; } } } int main () { printf ("%d\n", get_stack_direction ()); return 0; } ------------------------------------------------------------------------------- But it doesn't prevent it safely! With gcc-4.6.0 for x86 and -O3 optimization, I get the wrong result: $ /arch/x86-linux/gnu-inst-gcc/4.6.0/bin/gcc -O2 foo.c $ ./a.out -1 $ /arch/x86-linux/gnu-inst-gcc/4.6.0/bin/gcc -O3 foo.c $ ./a.out 1 Bruno -- In memoriam Neda Agha-Soltan <http://en.wikipedia.org/wiki/Neda_Agha-Soltan>