File: leak-tree.c

package info (click to toggle)
valgrind 1%3A3.2.1-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 27,372 kB
  • ctags: 23,091
  • sloc: ansic: 192,648; xml: 10,723; sh: 4,750; perl: 4,023; makefile: 2,103; asm: 1,813; cpp: 140; haskell: 139
file content (46 lines) | stat: -rw-r--r-- 682 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
#include "../memcheck.h"

struct foo {
	struct foo *l, *r;
};

struct foo *mk(struct foo *l, struct foo *r)
{
	struct foo *f = malloc(sizeof(*f));
	f->l = l;
	f->r = r;

	return f;
}

int main()
{
	struct foo *volatile a, *volatile b, *volatile c;

	b = mk(mk(0, 0), 0);

	/* Partially leaked tree structure */
	a = mk(mk(mk(mk(mk(0, 0), 0), mk(mk(0, 0), b)), mk(0, 0)), mk(0,0));
		   
	a = NULL;

	VALGRIND_DO_LEAK_CHECK;

	b = NULL;		/* now leak old b */

	/* Completely leaked, but part of the structure is shared */
	b = mk(0,0);
	b->l = b;
	b->r = b;

	a = mk(b,b);
	c = mk(b,b);

	a = b = c = 0;

	VALGRIND_DO_LEAK_CHECK;

	return 0;
}