Home | History | Annotate | Download | only in tests
      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 
     13 typedef unsigned char UChar;
     14 typedef unsigned int  UInt;
     15 
     16 
     17 static UInt seed = 0;
     18 static 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 
     25 static void barf ( int size, int offset )
     26 {
     27    printf("pdb-realloc2: fail: size %d, offset %d\n", size,offset);
     28    exit(1);
     29 }
     30 
     31 void 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 
    100 int 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