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; }