1 2/* A small demo of providing descriptions of structured types in error 3 messages. */ 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 21void 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 VALGRIND_CHECK_MEM_IS_DEFINED(a, 1); 29 *a = saved; 30 free(undefp); 31} 32 33#include <stdio.h> 34#include <string.h> 35 36typedef struct { short c1; char* c2[3]; } XX; 37 38typedef 39 struct _str { int bing; int bong; XX xyzzy[77]; } 40 Str; 41 42__attribute__((noinline)) 43int blah ( int x, int y ) 44{ 45 Str a[10]; 46 memset(a, 0, sizeof(a)); 47 croak(1 + (char*)(&a[3].xyzzy[x*y].c1)); 48 croak( (char*)(&a[5].bong) ); 49 croak( 1 + (char*)(&a[3].xyzzy[x*y].c2[2]) ); 50 memset(a, 0, sizeof(a)); 51 return a[3].xyzzy[x*y].c1; 52} 53 54int main ( void ) 55{ 56 printf("answer is %d\n", blah(3,7) ); 57 return 0; 58} 59