/* Check basic stack overflow detection. It's difficult to get consistent behaviour across all platforms. For example, x86 w/ gcc-4.3.1 gives Expected: stack array "a" in frame 2 back from here Actual: stack array "beforea" in frame 2 back from here whereas amd64 w/ gcc-4.3.1 gives Expected: stack array "a" in frame 2 back from here Actual: unknown This happens because on x86 the arrays are placed on the stack without holes in between, but not so for amd64. I don't know why. */ #include <stdio.h> __attribute__((noinline)) void foo ( long* sa, int n ) { int i; for (i = 0; i < n; i++) sa[i] = 0; } __attribute__((noinline)) void bar ( long* sa, int n ) { foo(sa, n); } int main ( void ) { int i; long beforea[3]; long a[7]; long aftera[3]; bar(a, 7+1); /* generates error */ bar(a, 7+0); /* generates no error */ for (i = 0; i < 7+1; i++) { a[i] = 0; } {char beforebuf[8]; char buf[8]; char afterbuf[8]; sprintf(buf, "%d", 123456789); return 1 & ((a[4] + beforea[1] + aftera[1] + beforebuf[1] + buf[2] + afterbuf[3]) / 100000) ; } }