Home | History | Annotate | Download | only in tests
      1 
      2 /* A small demo of providing descriptions of structured types in error
      3    messages. */
      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 
     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   VALGRIND_CHECK_MEM_IS_DEFINED(a, 1);
     29   *a = saved;
     30   free(undefp);
     31 }
     32 
     33 #include <stdio.h>
     34 #include <string.h>
     35 
     36 typedef struct { short c1; char* c2[3]; } XX;
     37 
     38 typedef
     39    struct _str { int bing; int bong; XX xyzzy[77]; }
     40    Str;
     41 
     42 __attribute__((noinline))
     43 int blah ( int x, int y )
     44 {
     45   Str a[10];
     46   memset(a, 0, sizeof(a));
     47   croak(1 + (char*)(&a[3].xyzzy[x*y].c1));
     48   croak( (char*)(&a[5].bong) );
     49   croak( 1 + (char*)(&a[3].xyzzy[x*y].c2[2]) );
     50   memset(a, 0, sizeof(a));
     51   return a[3].xyzzy[x*y].c1;
     52 }
     53 
     54 int main ( void )
     55 {
     56   printf("answer is %d\n", blah(3,7) );
     57   return 0;
     58 }
     59