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