1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A concatenation of varinfo1 .. varinfo4 in a shared object. This 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is to check for correct functionality in a non-zero-biased ELF 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown executable. */ 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Relevant compile flags are: 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown -Wall -g -I$prefix/include/valgrind 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown eg -Wall -g -I`pwd`/Inst/include/valgrind 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h> 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "memcheck/memcheck.h" 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Cause memcheck to complain about the address "a" and so to print 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown its best guess as to what "a" actually is. a must be 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addressible. */ 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid croak ( void* aV ) 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char* a = (char*)aV; 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char* undefp = malloc(1); 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char saved = *a; 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(undefp); 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *a = *undefp; 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov (void) VALGRIND_CHECK_MEM_IS_DEFINED(a, 1); 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *a = saved; 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown free(undefp); 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ------------ varinfo1 ------------ */ 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint global_u1; 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint global_i1 = 17; 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownchar global_u2[10]; 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownchar global_i2[10] = { 1,2,3,4,5,6,7,8,9,10 }; 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int varinfo1_main ( void ) 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int local; 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char* onheap = malloc(3); 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown assert(onheap); 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak(onheap+1); 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown free(onheap); 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak( &global_u1 ); 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak( &global_i1 ); 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak( &global_u2[3] ); 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak( &global_i2[7] ); 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak( &local ); 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ------------ varinfo2 ------------ */ 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void foo2 ( void ) 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int var; 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown var = 1; 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { char var[10]; 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown var[6] = 4; 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak( &var[7] ); 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { struct { double foo; float bar; } var; 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak ( 2 + (char*)&var.bar ); 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak( 1 + (char*)&var ); 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int varinfo2_main ( void ) 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown foo2(); 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ------------ varinfo3 ------------ */ 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic char static_global_def[10] = {0,0,0,0,0, 0,0,0,0,0}; 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char nonstatic_global_def[10] = {0,0,0,0,0, 0,0,0,0,0}; 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic char static_global_undef[10]; 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char nonstatic_global_undef[10]; 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void bar3 ( char* p1, char* p2, char* p3, char* p4 ) 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak(p1); 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak(p2); 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak(p3); 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak(p4); 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void foo3 ( void ) 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static char static_local_def[10] = {0,0,0,0,0, 0,0,0,0,0}; 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char nonstatic_local_def[10] = {0,0,0,0,0, 0,0,0,0,0}; 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static char static_local_undef[10]; 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char nonstatic_local_undef[10]; 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak ( 1 + (char*)&static_global_def ); 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak ( 2 + (char*)&nonstatic_global_def ); 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak ( 3 + (char*)&static_global_undef ); 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak ( 4 + (char*)&nonstatic_global_undef ); 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bar3( 5 + (char*)&static_local_def, 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6 + (char*)&nonstatic_local_def, 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 7 + (char*)&static_local_undef, 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8 + (char*)&nonstatic_local_undef ); 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int varinfo3_main ( void ) 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown foo3(); 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ------------ varinfo4 ------------ */ 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h> 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct { short c1; char* c2[3]; } XX; 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct _str { int bing; int bong; XX xyzzy[77]; } 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Str; 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int blah4 ( int x, int y ) 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Str a[10]; 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memset(a, 0, sizeof(a)); 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak(1 + (char*)(&a[3].xyzzy[x*y].c1)); 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak( (char*)(&a[5].bong) ); 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown croak( 1 + (char*)(&a[3].xyzzy[x*y].c2[2]) ); 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memset(a, 0, sizeof(a)); 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return a[3].xyzzy[x*y].c1; 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline)) 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic int varinfo4_main ( void ) 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "answer is %d\n", blah4(3,7) ); 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ------------ varinfo5 ------------ */ 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid varinfo5_main ( void ) 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown varinfo1_main(); 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown varinfo2_main(); 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown varinfo3_main(); 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown varinfo4_main(); 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 159