1
2 /* Basic check of variable location identification, in a zero-biased
3 executable. */
4
5 /* Relevant compile flags are:
6
7 -Wall -g -I$prefix/include/valgrind
8
9 eg -Wall -g -I`pwd`/Inst/include/valgrind
10 */
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <assert.h>
15 #include "memcheck/memcheck.h"
16
17 /* Cause memcheck to complain about the address "a" and so to print
18 its best guess as to what "a" actually is. a must be
19 addressible. */
20
croak(void * aV)21 void croak ( void* aV )
22 {
23 char* a = (char*)aV;
24 char* undefp = malloc(1);
25 char saved = *a;
26 assert(undefp);
27 *a = *undefp;
28 (void) VALGRIND_CHECK_MEM_IS_DEFINED(a, 1);
29 *a = saved;
30 free(undefp);
31 }
32
33 #include <stdio.h>
34
35 int global_u1;
36
37 int global_i1 = 17;
38
39 char global_u2[10];
40
41 char global_i2[10] = { 1,2,3,4,5,6,7,8,9,10 };
42
43
main(void)44 int main ( void )
45 {
46 int local;
47 char* onheap = malloc(3);
48 assert(onheap);
49 croak(onheap+1);
50 free(onheap);
51
52 croak( &global_u1 );
53 croak( &global_i1 );
54 croak( &global_u2[3] );
55 croak( &global_i2[7] );
56 croak( &local );
57 return 0;
58 }
59