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
21void 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
35int global_u1;
36
37int global_i1 = 17;
38
39char global_u2[10];
40
41char global_i2[10] = { 1,2,3,4,5,6,7,8,9,10 };
42
43
44int 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