1b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
2b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Check for correct handling of static vs non-static, local vs
3b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   non-local variables in a zero-biased executable. */
4b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Relevant compile flags are:
5b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
6b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   -Wall -g -I$prefix/include/valgrind
7b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
8b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   eg -Wall -g -I`pwd`/Inst/include/valgrind
9b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj*/
10b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Unfortunately 2008 Feb 26, requires its own filter_varinfo3, since
11b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   nonstatic_local_{un}def are not handled properly and so end up with
12b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   compiler-dependent names, eg static_local_def.2919 and
13b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   static_local_undef.2921.  So filter off the .nnnn part. */
14b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <stdio.h>
15b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <stdlib.h>
16b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include <assert.h>
17b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include "memcheck/memcheck.h"
18b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Cause memcheck to complain about the address "a" and so to print
19b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   its best guess as to what "a" actually is.  a must be
20b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   addressible. */
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
35b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic char static_global_def[10]    = {0,0,0,0,0, 0,0,0,0,0};
36b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj       char nonstatic_global_def[10] = {0,0,0,0,0, 0,0,0,0,0};
37b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstatic char static_global_undef[10];
38b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj       char nonstatic_global_undef[10];
39b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
40b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid bar ( char* p1, char* p2, char* p3, char* p4 )
41b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
42b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak(p1);
43b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak(p2);
44b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak(p3);
45b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak(p4);
46b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
47b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
48b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid foo ( void )
49b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
50b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   static char static_local_def[10]    = {0,0,0,0,0, 0,0,0,0,0};
51b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj          char nonstatic_local_def[10] = {0,0,0,0,0, 0,0,0,0,0};
52b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   static char static_local_undef[10];
53b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj          char nonstatic_local_undef[10];
54b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak ( 1 + (char*)&static_global_def );
55b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak ( 2 + (char*)&nonstatic_global_def );
56b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak ( 3 + (char*)&static_global_undef );
57b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   croak ( 4 + (char*)&nonstatic_global_undef );
58b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   bar( 5 + (char*)&static_local_def,
59b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj        6 + (char*)&nonstatic_local_def,
60b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj        7 + (char*)&static_local_undef,
61b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj        8 + (char*)&nonstatic_local_undef );
62b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
63b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
64b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjint main ( void )
65b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj{
66b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  foo();
67b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj  return 0;
68b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
69