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