1 2 /* Basic check of variable location identification, in a zero-biased 3 executable. */ 4 5 /* Relevant compile flags are: 6 7 -Wall -g -I$prefix/include/valgrind 8 9 eg -Wall -g -I`pwd`/Inst/include/valgrind 10 */ 11 12 #include <stdio.h> 13 #include <stdlib.h> 14 #include <assert.h> 15 #include "memcheck/memcheck.h" 16 17 /* Cause memcheck to complain about the address "a" and so to print 18 its best guess as to what "a" actually is. a must be 19 addressible. */ 20 21 void croak ( void* aV ) 22 { 23 char* a = (char*)aV; 24 char* undefp = malloc(1); 25 char saved = *a; 26 assert(undefp); 27 *a = *undefp; 28 (void) VALGRIND_CHECK_MEM_IS_DEFINED(a, 1); 29 *a = saved; 30 free(undefp); 31 } 32 33 #include <stdio.h> 34 35 int global_u1; 36 37 int global_i1 = 17; 38 39 char global_u2[10]; 40 41 char global_i2[10] = { 1,2,3,4,5,6,7,8,9,10 }; 42 43 44 int main ( void ) 45 { 46 int local; 47 char* onheap = malloc(3); 48 assert(onheap); 49 croak(onheap+1); 50 free(onheap); 51 52 croak( &global_u1 ); 53 croak( &global_i1 ); 54 croak( &global_u2[3] ); 55 croak( &global_i2[7] ); 56 croak( &local ); 57 return 0; 58 } 59