| #include <stdlib.h> |
| |
| #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; |
| } |