1b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 2b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* A small demo of providing descriptions of structured types in error 3b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj messages. */ 4b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 5b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Relevant compile flags are: 6b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 7b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj -Wall -g -I$prefix/include/valgrind 8b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 9b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj eg -Wall -g -I`pwd`/Inst/include/valgrind 10b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj*/ 11b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 12b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <stdio.h> 13b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <stdlib.h> 14b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <assert.h> 15b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include "memcheck/memcheck.h" 16b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 17b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Cause memcheck to complain about the address "a" and so to print 18b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj its best guess as to what "a" actually is. a must be 19b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj addressible. */ 20b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 21b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid croak ( void* aV ) 22b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{ 23b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj char* a = (char*)aV; 24b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj char* undefp = malloc(1); 25b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj char saved = *a; 26b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj assert(undefp); 27b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj *a = *undefp; 2806bc722457ffe12e056d2f40d0d2f5c8711b541fflorian (void) VALGRIND_CHECK_MEM_IS_DEFINED(a, 1); 29b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj *a = saved; 30b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj free(undefp); 31b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj} 32b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 33b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <stdio.h> 34b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <string.h> 35b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 36b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef struct { short c1; char* c2[3]; } XX; 37b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 38b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef 39b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct _str { int bing; int bong; XX xyzzy[77]; } 40b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Str; 41b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 42b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj__attribute__((noinline)) 43b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjint blah ( int x, int y ) 44b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{ 45b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Str a[10]; 46b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj memset(a, 0, sizeof(a)); 47b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak(1 + (char*)(&a[3].xyzzy[x*y].c1)); 48b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak( (char*)(&a[5].bong) ); 49b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak( 1 + (char*)(&a[3].xyzzy[x*y].c2[2]) ); 50b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj memset(a, 0, sizeof(a)); 51b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj return a[3].xyzzy[x*y].c1; 52b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj} 53b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 54b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjint main ( void ) 55b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{ 56b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj printf("answer is %d\n", blah(3,7) ); 57b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj return 0; 58b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj} 59