| #include <stdio.h> |
| #include <stdlib.h> |
| #include "../memcheck.h" |
| #include "leak.h" |
| |
| char *b10; |
| char *b21; |
| char *b32_33[2]; |
| static void breakme() {}; |
| void f(void) |
| { |
| int i; |
| |
| b10 = malloc (10); |
| |
| fprintf(stderr, "expecting details 10 bytes reachable\n"); fflush(stderr); breakme(); |
| VALGRIND_DO_LEAK_CHECK; |
| |
| fprintf(stderr, "expecting to have NO details\n"); fflush(stderr); breakme(); |
| VALGRIND_DO_ADDED_LEAK_CHECK; |
| |
| b10--; // lose b10 |
| b21 = malloc (21); |
| fprintf(stderr, "expecting details +10 bytes lost, +21 bytes reachable\n"); fflush(stderr); breakme(); |
| VALGRIND_DO_ADDED_LEAK_CHECK; |
| |
| for (i = 0; i < 2; i ++) |
| b32_33[i] = malloc (32+i); |
| fprintf(stderr, "expecting details +65 bytes reachable\n"); fflush(stderr); breakme(); |
| VALGRIND_DO_ADDED_LEAK_CHECK; |
| |
| fprintf(stderr, "expecting to have NO details\n"); fflush(stderr); breakme(); |
| VALGRIND_DO_ADDED_LEAK_CHECK; |
| |
| b10++; |
| fprintf(stderr, "expecting details +10 bytes reachable\n"); fflush(stderr); breakme(); |
| VALGRIND_DO_ADDED_LEAK_CHECK; |
| |
| b10--; |
| fprintf(stderr, "expecting details -10 bytes reachable, +10 bytes lost\n"); fflush(stderr); breakme(); |
| VALGRIND_DO_CHANGED_LEAK_CHECK; |
| |
| b10++; |
| fprintf(stderr, "expecting details -10 bytes lost, +10 bytes reachable\n"); fflush(stderr); breakme(); |
| VALGRIND_DO_CHANGED_LEAK_CHECK; |
| |
| b32_33[0]--; |
| fprintf(stderr, "expecting details 32 (+32) bytes lost, 33 (-32) bytes reachable\n"); fflush(stderr); breakme(); |
| VALGRIND_DO_CHANGED_LEAK_CHECK; |
| |
| fprintf(stderr, "finished\n"); |
| } |
| |
| int main(void) |
| { |
| DECLARE_LEAK_COUNTERS; |
| |
| GET_INITIAL_LEAK_COUNTS; |
| |
| f(); // see leak-cases.c |
| |
| |
| GET_FINAL_LEAK_COUNTS; |
| |
| PRINT_LEAK_COUNTS(stderr); |
| |
| return 0; |
| } |