1b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 2b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Basic check of variable location identification, in a zero-biased 3b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj executable. */ 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 35b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjint global_u1; 36b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 37b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjint global_i1 = 17; 38b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 39b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjchar global_u2[10]; 40b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 41b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjchar global_i2[10] = { 1,2,3,4,5,6,7,8,9,10 }; 42b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 43b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 44b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjint main ( void ) 45b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{ 46b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj int local; 47b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj char* onheap = malloc(3); 48b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj assert(onheap); 49b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak(onheap+1); 50b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj free(onheap); 51b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 52b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak( &global_u1 ); 53b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak( &global_i1 ); 54b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak( &global_u2[3] ); 55b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak( &global_i2[7] ); 56b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak( &local ); 57b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj return 0; 58b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj} 59