File: leak-cycle.c

package info (click to toggle)
valgrind 1%3A3.12.0~svn20160714-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 120,428 kB
  • ctags: 70,855
  • sloc: ansic: 674,645; exp: 26,134; xml: 21,574; asm: 7,570; cpp: 7,567; makefile: 7,380; sh: 6,188; perl: 5,855; haskell: 195
file content (78 lines) | stat: -rw-r--r-- 1,097 bytes parent folder | download | duplicates (10)
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <stdlib.h>
#include "leak.h"
#include "../memcheck.h"

struct n {
	struct n *l;
	struct n *r;
        // This ensures it's the same size on 32-bit and 64-bit platforms.
        char padding[ 2 * (8 - sizeof(struct n*)) ];
};

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

	return n;
}

static struct n *mkcycle()
{
	register struct n *a, *b, *c;

	a = mk(0,0);
	b = mk(a,0);
	c = mk(b,0);
	a->l = c;

	return a;
}


int main()
{
	DECLARE_LEAK_COUNTERS;

	struct n *volatile c1, *volatile c2;

        GET_INITIAL_LEAK_COUNTS;

	/* two simple cycles */
	c1 = mkcycle();
	c2 = mkcycle();

	c1 = c2 = 0;

	/* one cycle linked to another */
	c1 = mkcycle();
	c2 = mkcycle();

	/* This is to make sure we end up merging cliques; see
	   mc_leakcheck.c */
	if (c1 < c2)
		c2->r = c1;
	else
		c1->r = c2;

	c1 = c2 = 0;

	/* two linked cycles */
	c1 = mkcycle();
	c2 = mkcycle();

	c1->r = c2;
	c2->r = c1;

	c1 = c2 = 0;

	CLEAR_CALLER_SAVED_REGS;

	GET_FINAL_LEAK_COUNTS;

	PRINT_LEAK_COUNTS(stderr);

	return 0;
}