1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A test which involves copying (using realloc) a block containing
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   some partially defined bytes.  Really this is to check that
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   copy_address_range_perms in mc_main.c works.  I don't think it's a
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   good test - it may well not exercise all the code in
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   copy_address_range_perms. */
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h>
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "memcheck/memcheck.h"
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef unsigned char UChar;
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef unsigned int  UInt;
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt seed = 0;
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline UInt myrand ( UInt size )
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* From "Numerical Recipes in C" 2nd Edition */
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   seed = 1664525UL * seed + 1013904223UL;
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return seed % size;
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void barf ( int size, int offset )
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("pdb-realloc2: fail: size %d, offset %d\n", size,offset);
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   exit(1);
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_test ( int size )
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   int i,j,r;
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UChar* v;
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UChar* p = malloc(size);
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(p);
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // fill
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   seed = 0;
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < size; i++) {
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      j = myrand( 256 * 25 );
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      //printf("%d\n", j);
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (j >= 256 * 13) {
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // def 1s
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p[i] = 0xFF;
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (j >= 256 && j < 256*13) {
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // def 0s
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p[i] = 0;
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // pdb
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         p[i] &= (UChar)j;
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // copy
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 1; i <= 100; i++) {
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      p = realloc(p, size+i);
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assert(p);
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // check
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   v = malloc(size+100);
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(v);
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   r = VALGRIND_GET_VBITS(p,v, size+100);
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(r == 1);
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //for (i = 0; i < size+100; i++)
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //  printf("%02x ", (UInt)v[i]);
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   //printf("\n");
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   seed = 0;
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < size; i++) {
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      j = myrand( 256 * 25 );
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (j >= 256) {
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // expecting a defined value
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (v[i] != 0)
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            barf(size, i);
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } else {
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         // expecting a PDB == j
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         if (v[i] != (UChar)j)
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            barf(size,i);
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // in the extension area, everything should be undefined
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (i = 0; i < 100; i++) {
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      if (v[size+i] != 0xFF)
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         barf(size, i);
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(v);
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(p);
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int z;
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (z = 0; z < 100; z++) {
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     printf("pdb_realloc: z = %d\n", z);
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     do_test(z);
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     do_test(z + 173);
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     do_test(z + 1731);
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  printf("pdb-realloc2: done\n");
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
112