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