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