1#include <stdio.h>
2#include <stdlib.h>
3#include "../memcheck.h"
4#include "leak.h"
5
6char *b10;
7char *b21;
8char *b32_33[2];
9static void breakme() {};
10void f(void)
11{
12   int i;
13
14   b10 = malloc (10);
15
16   fprintf(stderr, "expecting details 10 bytes reachable\n"); fflush(stderr); breakme();
17   VALGRIND_DO_LEAK_CHECK;
18
19   fprintf(stderr, "expecting to have NO details\n"); fflush(stderr); breakme();
20   VALGRIND_DO_ADDED_LEAK_CHECK;
21
22   b10--; // lose b10
23   b21 = malloc (21);
24   fprintf(stderr, "expecting details +10 bytes lost, +21 bytes reachable\n"); fflush(stderr); breakme();
25   VALGRIND_DO_ADDED_LEAK_CHECK;
26
27   for (i = 0; i < 2; i ++)
28      b32_33[i] = malloc (32+i);
29   fprintf(stderr, "expecting details +65 bytes reachable\n"); fflush(stderr); breakme();
30   VALGRIND_DO_ADDED_LEAK_CHECK;
31
32   fprintf(stderr, "expecting to have NO details\n"); fflush(stderr); breakme();
33   VALGRIND_DO_ADDED_LEAK_CHECK;
34
35   b10++;
36   fprintf(stderr, "expecting details +10 bytes reachable\n"); fflush(stderr); breakme();
37   VALGRIND_DO_ADDED_LEAK_CHECK;
38
39   b10--;
40   fprintf(stderr, "expecting details -10 bytes reachable, +10 bytes lost\n"); fflush(stderr); breakme();
41   VALGRIND_DO_CHANGED_LEAK_CHECK;
42
43   b10++;
44   fprintf(stderr, "expecting details -10 bytes lost, +10 bytes reachable\n"); fflush(stderr); breakme();
45   VALGRIND_DO_CHANGED_LEAK_CHECK;
46
47   b32_33[0]--;
48   fprintf(stderr, "expecting details 32 (+32) bytes lost, 33 (-32) bytes reachable\n"); fflush(stderr); breakme();
49   VALGRIND_DO_CHANGED_LEAK_CHECK;
50
51   fprintf(stderr, "finished\n");
52}
53
54int main(void)
55{
56   DECLARE_LEAK_COUNTERS;
57
58   GET_INITIAL_LEAK_COUNTS;
59
60   f();   // see leak-cases.c
61
62
63   GET_FINAL_LEAK_COUNTS;
64
65   PRINT_LEAK_COUNTS(stderr);
66
67   return 0;
68}
69