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))
22void 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
38int global_u1;
39
40int global_i1 = 17;
41
42char global_u2[10];
43
44char global_i2[10] = { 1,2,3,4,5,6,7,8,9,10 };
45
46__attribute__((noinline))
47static 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))
65static 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))
79static int varinfo2_main ( void )
80{
81  foo2();
82  return 0;
83}
84
85/* ------------ varinfo3 ------------ */
86
87static 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};
89static char static_global_undef[10];
90       char nonstatic_global_undef[10];
91__attribute__((noinline))
92static 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))
100static 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))
116static int varinfo3_main ( void )
117{
118  foo3();
119  return 0;
120}
121
122/* ------------ varinfo4 ------------ */
123
124#include <string.h>
125
126typedef struct { short c1; char* c2[3]; } XX;
127
128typedef
129   struct _str { int bing; int bong; XX xyzzy[77]; }
130   Str;
131
132__attribute__((noinline))
133static 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))
144static int varinfo4_main ( void )
145{
146  fprintf(stderr, "answer is %d\n", blah4(3,7) );
147  return 0;
148}
149
150/* ------------ varinfo5 ------------ */
151
152void varinfo5_main ( void )
153{
154   varinfo1_main();
155   varinfo2_main();
156   varinfo3_main();
157   varinfo4_main();
158}
159