1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A small demo of providing descriptions of structured types in error
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   messages. */
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Relevant compile flags are:
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   -Wall -g -I$prefix/include/valgrind
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   eg -Wall -g -I`pwd`/Inst/include/valgrind
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h>
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "memcheck/memcheck.h"
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Cause memcheck to complain about the address "a" and so to print
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   its best guess as to what "a" actually is.  a must be
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   addressible. */
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
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#include <string.h>
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct { short c1; char* c2[3]; } XX;
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct _str { int bing; int bong; XX xyzzy[77]; }
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Str;
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown__attribute__((noinline))
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint blah ( int x, int y )
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Str a[10];
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  memset(a, 0, sizeof(a));
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  croak(1 + (char*)(&a[3].xyzzy[x*y].c1));
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  croak( (char*)(&a[5].bong) );
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  croak( 1 + (char*)(&a[3].xyzzy[x*y].c2[2]) );
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  memset(a, 0, sizeof(a));
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return a[3].xyzzy[x*y].c1;
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  printf("answer is %d\n", blah(3,7) );
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
59