partial_load_ok.vgtest partial_load_ok.stderr.exp partial_load_ok.stderr.exp64 \
partial_load_dflt.vgtest partial_load_dflt.stderr.exp partial_load_dflt.stderr.exp64 \
pdb-realloc.stderr.exp pdb-realloc.vgtest \
+ pdb-realloc2.stderr.exp pdb-realloc2.stdout.exp pdb-realloc2.vgtest \
pipe.stderr.exp pipe.vgtest \
pointer-trace.vgtest \
pointer-trace.stderr.exp pointer-trace.stderr.exp64 \
nanoleak new_nothrow \
null_socket oset_test overlap \
partiallydefinedeq \
- partial_load pdb-realloc \
+ partial_load pdb-realloc pdb-realloc2 \
pipe pointer-trace \
post-syscall \
realloc1 realloc2 realloc3 \
--- /dev/null
+
+/* 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;
+}