1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "../memcheck.h" 4 #include "leak.h" 5 6 char *b10; 7 char *b21; 8 char *b32_33[2]; 9 static void breakme() {}; 10 void 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 54 int 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