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