1extern void abort(void); 2 3struct foo { 4 int rank; 5 char *name; 6}; 7 8struct mem { 9 struct foo *x[4]; 10}; 11 12void __attribute__((noinline)) bar(struct foo **f) 13{ 14 *f = __builtin_malloc(sizeof(struct foo)); 15} 16struct foo * __attribute__((noinline, noclone)) foo(int rank) 17{ 18 void *x = __builtin_malloc(sizeof(struct mem)); 19 struct mem *as = x; 20 struct foo **upper = &as->x[rank * 8 - 5]; 21 *upper = 0; 22 bar(upper); 23 return *upper; 24} 25 26int main() 27{ 28 if (foo(1) == 0) 29 abort (); 30 return 0; 31} 32