blob: 59b1ccdf90ea83868ba576d9683454382672d338 [file] [log] [blame]
sewardjcbdddcf2005-03-10 23:23:45 +00001#include <stdio.h>
2#include <stdlib.h>
njnc0b26182009-03-12 03:00:05 +00003#include "leak.h"
sewardjcbdddcf2005-03-10 23:23:45 +00004#include "../memcheck.h"
5
njnc0b26182009-03-12 03:00:05 +00006/* We build this tree:
7
8 A
9 / \
10 B C
11 / \ / \
12 D E F G
13
14 Then we leak D and C-F-G.
15*/
sewardjcbdddcf2005-03-10 23:23:45 +000016
njnc0b26182009-03-12 03:00:05 +000017typedef
18 struct _Node {
19 struct _Node *l;
20 struct _Node *r;
21 // Padding ensures the structu is the same size on 32-bit and 64-bit
22 // machines.
23 char padding[16 - 2*sizeof(struct _Node*)];
24 } Node;
25
26Node* mk(void)
sewardjcbdddcf2005-03-10 23:23:45 +000027{
njnc0b26182009-03-12 03:00:05 +000028 Node *x = malloc(sizeof(Node));
29 x->l = NULL;
30 x->r = NULL;
31 return x;
sewardjcbdddcf2005-03-10 23:23:45 +000032}
33
njnc0b26182009-03-12 03:00:05 +000034// This is a definite root.
35Node* t;
36
37void f(void)
sewardjcbdddcf2005-03-10 23:23:45 +000038{
njnc0b26182009-03-12 03:00:05 +000039 // Building like this rather than "t = mk(mk(mk(NULL, NULL), ...)" seems to
40 // help avoid leaving pointers on the stack to supposedly-leaked blocks.
41 t = mk(); // A
42 t->l = mk(); // B
43 t->r = mk(); // C (48(16d,32i)/1 definitely leaked from here)
44 t->l->l = mk(); // D (16/1 definitely leaked from here)
45 t->l->r = mk(); // E
46 t->r->l = mk(); // F
47 t->r->r = mk(); // G
sewardjcbdddcf2005-03-10 23:23:45 +000048
njnc0b26182009-03-12 03:00:05 +000049 // Sever B->D, leaking D
50 t->l->l = NULL;
51
52 // Sever A->C, leaking C-F-G
53 t->r = NULL;
sewardjcbdddcf2005-03-10 23:23:45 +000054}
njnc0b26182009-03-12 03:00:05 +000055
56int main(void)
57{
58 DECLARE_LEAK_COUNTERS;
59
60 GET_INITIAL_LEAK_COUNTS;
61
62 // See leak-cases.c for why we do the work in f().
63 f();
64
Elliott Hughesed398002017-06-21 14:41:24 -070065 CLEAR_CALLER_SAVED_REGS;
njnc0b26182009-03-12 03:00:05 +000066 GET_FINAL_LEAK_COUNTS;
67
68 PRINT_LEAK_COUNTS(stderr);
69
70 return 0;
71}
72