mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
54 lines
1.1 KiB
C
54 lines
1.1 KiB
C
|
|
/* 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) ;
|
|
}
|
|
}
|