#include #include #define SIZE 1024*100 #define MAXCOPYSIZE 1024*50 #define MAXSRCOFFSET 13 #define MAXDSTOFFSET 18 #define SRCVAL(N) ((N+10000) % 13) #define DSTVAL(N) ((N+20001) % 17) char src[SIZE], dst[SIZE]; #ifndef MEMCPY_NAME #define MEMCPY_NAME memcpy #endif extern void *MEMCPY_NAME(void *, const void *, size_t); test(int src_offset, int dst_offset, int size) { int i; char *x, *y; for (i = 0; i < SIZE; i++) { src[i] = SRCVAL(i); dst[i] = DSTVAL(i); } x = src; y = dst; x = x + src_offset; y = y + dst_offset; MEMCPY_NAME(&dst[dst_offset], &src[src_offset], size); for (i = 0; i < SIZE; i++) { if (src[i] != SRCVAL(i)) printf("FAIL, src got changed\n"); if (i < dst_offset) { if (dst[i] != DSTVAL(i)) printf("FAIL, dst got changed before it should be\n"); } else if (i >= (dst_offset+size)) { if (dst[i] != DSTVAL(i)) printf("FAIL, dst got changed after it should be (%d %d %d %d)\n", src_offset, dst_offset, size, i); } else { if (dst[i] != SRCVAL(i-dst_offset+src_offset)) { printf("FAIL, dst was not changed when it should be (%d %d %d %d)\n", src_offset, dst_offset, size, i); } } } } main() { int i, j, k; for (i = 8; i < MAXDSTOFFSET; i++) for (j = 8; j < MAXSRCOFFSET; j++) for (k = MAXCOPYSIZE-20; k < MAXCOPYSIZE; k++) test(i, j, k); }