1 int check_fa_work (const char *, const char *) __attribute__((noinline)); 2 int check_fa_mid (const char *) __attribute__((noinline)); 3 int check_fa (char *) __attribute__((noinline)); 4 int how_much (void) __attribute__((noinline)); 5 check_fa_work(const char * c,const char * f)6int check_fa_work (const char *c, const char *f) 7 { 8 const char d = 0; 9 10 if (c >= &d) 11 return c >= f && f >= &d; 12 else 13 return c <= f && f <= &d; 14 } 15 check_fa_mid(const char * c)16int check_fa_mid (const char *c) 17 { 18 const char *f = __builtin_frame_address (0); 19 20 /* Prevent a tail call to check_fa_work, eliding the current stack frame. */ 21 return check_fa_work (c, f) != 0; 22 } 23 check_fa(char * unused)24int check_fa (char *unused) 25 { 26 const char c = 0; 27 28 /* Prevent a tail call to check_fa_mid, eliding the current stack frame. */ 29 return check_fa_mid (&c) != 0; 30 } 31 how_much(void)32int how_much (void) 33 { 34 return 8; 35 } 36 main(void)37int main (void) 38 { 39 char *unused = __builtin_alloca (how_much ()); 40 41 if (!check_fa(unused)) 42 abort(); 43 return 0; 44 } 45