extern void abort(void); | |
struct foo { | |
int rank; | |
char *name; | |
}; | |
struct mem { | |
struct foo *x[4]; | |
}; | |
void __attribute__((noinline)) bar(struct foo **f) | |
{ | |
*f = __builtin_malloc(sizeof(struct foo)); | |
} | |
struct foo * __attribute__((noinline, noclone)) foo(int rank) | |
{ | |
void *x = __builtin_malloc(sizeof(struct mem)); | |
struct mem *as = x; | |
struct foo **upper = &as->x[rank * 8 - 5]; | |
*upper = 0; | |
bar(upper); | |
return *upper; | |
} | |
int main() | |
{ | |
if (foo(1) == 0) | |
abort (); | |
return 0; | |
} |