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