#include #define nth_bit(x, n) ((x >> n) & 1) #define Fn(N, Np1) \ void* a##N(int x) { return ( nth_bit(x, N) ? a##Np1(x) : a##Np1(x) ); } // This test allocates a lot of heap memory, and every allocation features a // different stack trace -- the stack traces are effectively a // representation of the number 'i', where each function represents a bit in // 'i', and if it's a 1 the first function is called, and if it's a 0 the // second function is called. void* a999(int x) { return malloc(100); } Fn(17, 999) Fn(16, 17) Fn(15, 16) Fn(14, 15) Fn(13, 14) Fn(12, 13) Fn(11, 12) Fn(10, 11) Fn( 9, 10) Fn( 8, 9) Fn( 7, 8) Fn( 6, 7) Fn( 5, 6) Fn( 4, 5) Fn( 3, 4) Fn( 2, 3) Fn( 1, 2) Fn( 0, 1) int main(void) { int i; // Create a large XTree. for (i = 0; i < (1 << 18); i++) a0(i); // Do a lot of allocations so it gets dup'd a lot of times. for (i = 0; i < 100000; i++) { free(a1(234)); free(a2(111)); } return 0; }