| |
| /* A test which involves copying (using realloc) a block containing |
| some partially defined bytes. Really this is to check that |
| copy_address_range_perms in mc_main.c works. I don't think it's a |
| good test - it may well not exercise all the code in |
| copy_address_range_perms. */ |
| |
| #include <assert.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include "memcheck/memcheck.h" |
| |
| typedef unsigned char UChar; |
| typedef unsigned int UInt; |
| |
| |
| static UInt seed = 0; |
| static inline UInt myrand ( UInt size ) |
| { |
| /* From "Numerical Recipes in C" 2nd Edition */ |
| seed = 1664525UL * seed + 1013904223UL; |
| return seed % size; |
| } |
| |
| static void barf ( int size, int offset ) |
| { |
| printf("pdb-realloc2: fail: size %d, offset %d\n", size,offset); |
| exit(1); |
| } |
| |
| void do_test ( int size ) |
| { |
| int i,j,r; |
| UChar* v; |
| UChar* p = malloc(size); |
| assert(p); |
| // fill |
| seed = 0; |
| for (i = 0; i < size; i++) { |
| |
| j = myrand( 256 * 25 ); |
| //printf("%d\n", j); |
| if (j >= 256 * 13) { |
| // def 1s |
| p[i] = 0xFF; |
| } else |
| if (j >= 256 && j < 256*13) { |
| // def 0s |
| p[i] = 0; |
| } else { |
| // pdb |
| p[i] &= (UChar)j; |
| } |
| |
| } |
| |
| // copy |
| for (i = 1; i <= 100; i++) { |
| p = realloc(p, size+i); |
| assert(p); |
| } |
| |
| // check |
| v = malloc(size+100); |
| assert(v); |
| r = VALGRIND_GET_VBITS(p,v, size+100); |
| assert(r == 1); |
| |
| //for (i = 0; i < size+100; i++) |
| // printf("%02x ", (UInt)v[i]); |
| //printf("\n"); |
| |
| seed = 0; |
| for (i = 0; i < size; i++) { |
| |
| j = myrand( 256 * 25 ); |
| |
| if (j >= 256) { |
| // expecting a defined value |
| if (v[i] != 0) |
| barf(size, i); |
| } else { |
| // expecting a PDB == j |
| if (v[i] != (UChar)j) |
| barf(size,i); |
| } |
| |
| } |
| |
| // in the extension area, everything should be undefined |
| for (i = 0; i < 100; i++) { |
| if (v[size+i] != 0xFF) |
| barf(size, i); |
| } |
| |
| free(v); |
| free(p); |
| } |
| |
| int main ( void ) |
| { |
| int z; |
| for (z = 0; z < 100; z++) { |
| printf("pdb_realloc: z = %d\n", z); |
| do_test(z); |
| do_test(z + 173); |
| do_test(z + 1731); |
| } |
| printf("pdb-realloc2: done\n"); |
| return 0; |
| } |