1 #include <stdlib.h>
2 
3 #define nth_bit(x, n)   ((x >> n) & 1)
4 #define Fn(N, Np1) \
5    void* a##N(int x) { return ( nth_bit(x, N) ? a##Np1(x) : a##Np1(x) ); }
6 
7 // This test allocates a lot of heap memory, and every allocation features a
8 // different stack trace -- the stack traces are effectively a
9 // representation of the number 'i', where each function represents a bit in
10 // 'i', and if it's a 1 the first function is called, and if it's a 0 the
11 // second function is called.
12 
13 void* a999(int x)
14 {
15    return malloc(100);
16 }
17 
18 Fn(17, 999)
19 Fn(16, 17)
20 Fn(15, 16)
21 Fn(14, 15)
22 Fn(13, 14)
23 Fn(12, 13)
24 Fn(11, 12)
25 Fn(10, 11)
26 Fn( 9, 10)
27 Fn( 8, 9)
28 Fn( 7, 8)
29 Fn( 6, 7)
30 Fn( 5, 6)
31 Fn( 4, 5)
32 Fn( 3, 4)
33 Fn( 2, 3)
34 Fn( 1, 2)
35 Fn( 0, 1)
36 
37 int main(void)
38 {
39    int i;
40 
41    // Create a large XTree.
42    for (i = 0; i < (1 << 18); i++)
43       a0(i);
44 
45    // Do a lot of allocations so it gets dup'd a lot of times.
46    for (i = 0; i < 100000; i++) {
47       free(a1(234));
48       free(a2(111));
49    }
50 
51    return 0;
52 }
53