1b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 2b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Check for correct handling of static vs non-static, local vs 3b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj non-local variables in a zero-biased executable. */ 4b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Relevant compile flags are: 5b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 6b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj -Wall -g -I$prefix/include/valgrind 7b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 8b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj eg -Wall -g -I`pwd`/Inst/include/valgrind 9b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj*/ 10b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Unfortunately 2008 Feb 26, requires its own filter_varinfo3, since 11b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj nonstatic_local_{un}def are not handled properly and so end up with 12b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj compiler-dependent names, eg static_local_def.2919 and 13b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj static_local_undef.2921. So filter off the .nnnn part. */ 14b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <stdio.h> 15b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <stdlib.h> 16b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <assert.h> 17b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include "memcheck/memcheck.h" 18b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Cause memcheck to complain about the address "a" and so to print 19b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj its best guess as to what "a" actually is. a must be 20b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj addressible. */ 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 35b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic char static_global_def[10] = {0,0,0,0,0, 0,0,0,0,0}; 36b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj char nonstatic_global_def[10] = {0,0,0,0,0, 0,0,0,0,0}; 37b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic char static_global_undef[10]; 38b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj char nonstatic_global_undef[10]; 39b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 40b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid bar ( char* p1, char* p2, char* p3, char* p4 ) 41b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{ 42b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak(p1); 43b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak(p2); 44b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak(p3); 45b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak(p4); 46b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj} 47b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 48b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid foo ( void ) 49b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{ 50b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj static char static_local_def[10] = {0,0,0,0,0, 0,0,0,0,0}; 51b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj char nonstatic_local_def[10] = {0,0,0,0,0, 0,0,0,0,0}; 52b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj static char static_local_undef[10]; 53b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj char nonstatic_local_undef[10]; 54b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak ( 1 + (char*)&static_global_def ); 55b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak ( 2 + (char*)&nonstatic_global_def ); 56b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak ( 3 + (char*)&static_global_undef ); 57b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj croak ( 4 + (char*)&nonstatic_global_undef ); 58b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj bar( 5 + (char*)&static_local_def, 59b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 6 + (char*)&nonstatic_local_def, 60b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 7 + (char*)&static_local_undef, 61b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 8 + (char*)&nonstatic_local_undef ); 62b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj} 63b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 64b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjint main ( void ) 65b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{ 66b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj foo(); 67b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj return 0; 68b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj} 69