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
a999(int x)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
main(void)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