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