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