1*521adf53SAnton Blanchard #include <malloc.h> 2*521adf53SAnton Blanchard #include <stdlib.h> 3*521adf53SAnton Blanchard #include <string.h> 4*521adf53SAnton Blanchard #include "../utils.h" 5*521adf53SAnton Blanchard 6*521adf53SAnton Blanchard #define SIZE 256 7*521adf53SAnton Blanchard #define ITERATIONS 10000 8*521adf53SAnton Blanchard 9*521adf53SAnton Blanchard int test_memcmp(const void *s1, const void *s2, size_t n); 10*521adf53SAnton Blanchard 11*521adf53SAnton Blanchard /* test all offsets and lengths */ 12*521adf53SAnton Blanchard static void test_one(char *s1, char *s2) 13*521adf53SAnton Blanchard { 14*521adf53SAnton Blanchard unsigned long offset, size; 15*521adf53SAnton Blanchard 16*521adf53SAnton Blanchard for (offset = 0; offset < SIZE; offset++) { 17*521adf53SAnton Blanchard for (size = 0; size < (SIZE-offset); size++) { 18*521adf53SAnton Blanchard int x, y; 19*521adf53SAnton Blanchard unsigned long i; 20*521adf53SAnton Blanchard 21*521adf53SAnton Blanchard y = memcmp(s1+offset, s2+offset, size); 22*521adf53SAnton Blanchard x = test_memcmp(s1+offset, s2+offset, size); 23*521adf53SAnton Blanchard 24*521adf53SAnton Blanchard if (((x ^ y) < 0) && /* Trick to compare sign */ 25*521adf53SAnton Blanchard ((x | y) != 0)) { /* check for zero */ 26*521adf53SAnton Blanchard printf("memcmp returned %d, should have returned %d (offset %ld size %ld)\n", x, y, offset, size); 27*521adf53SAnton Blanchard 28*521adf53SAnton Blanchard for (i = offset; i < offset+size; i++) 29*521adf53SAnton Blanchard printf("%02x ", s1[i]); 30*521adf53SAnton Blanchard printf("\n"); 31*521adf53SAnton Blanchard 32*521adf53SAnton Blanchard for (i = offset; i < offset+size; i++) 33*521adf53SAnton Blanchard printf("%02x ", s2[i]); 34*521adf53SAnton Blanchard printf("\n"); 35*521adf53SAnton Blanchard abort(); 36*521adf53SAnton Blanchard } 37*521adf53SAnton Blanchard } 38*521adf53SAnton Blanchard } 39*521adf53SAnton Blanchard } 40*521adf53SAnton Blanchard 41*521adf53SAnton Blanchard static int testcase(void) 42*521adf53SAnton Blanchard { 43*521adf53SAnton Blanchard char *s1; 44*521adf53SAnton Blanchard char *s2; 45*521adf53SAnton Blanchard unsigned long i; 46*521adf53SAnton Blanchard 47*521adf53SAnton Blanchard s1 = memalign(128, SIZE); 48*521adf53SAnton Blanchard if (!s1) { 49*521adf53SAnton Blanchard perror("memalign"); 50*521adf53SAnton Blanchard exit(1); 51*521adf53SAnton Blanchard } 52*521adf53SAnton Blanchard 53*521adf53SAnton Blanchard s2 = memalign(128, SIZE); 54*521adf53SAnton Blanchard if (!s2) { 55*521adf53SAnton Blanchard perror("memalign"); 56*521adf53SAnton Blanchard exit(1); 57*521adf53SAnton Blanchard } 58*521adf53SAnton Blanchard 59*521adf53SAnton Blanchard srandom(1); 60*521adf53SAnton Blanchard 61*521adf53SAnton Blanchard for (i = 0; i < ITERATIONS; i++) { 62*521adf53SAnton Blanchard unsigned long j; 63*521adf53SAnton Blanchard unsigned long change; 64*521adf53SAnton Blanchard 65*521adf53SAnton Blanchard for (j = 0; j < SIZE; j++) 66*521adf53SAnton Blanchard s1[j] = random(); 67*521adf53SAnton Blanchard 68*521adf53SAnton Blanchard memcpy(s2, s1, SIZE); 69*521adf53SAnton Blanchard 70*521adf53SAnton Blanchard /* change one byte */ 71*521adf53SAnton Blanchard change = random() % SIZE; 72*521adf53SAnton Blanchard s2[change] = random() & 0xff; 73*521adf53SAnton Blanchard 74*521adf53SAnton Blanchard test_one(s1, s2); 75*521adf53SAnton Blanchard } 76*521adf53SAnton Blanchard 77*521adf53SAnton Blanchard srandom(1); 78*521adf53SAnton Blanchard 79*521adf53SAnton Blanchard for (i = 0; i < ITERATIONS; i++) { 80*521adf53SAnton Blanchard unsigned long j; 81*521adf53SAnton Blanchard unsigned long change; 82*521adf53SAnton Blanchard 83*521adf53SAnton Blanchard for (j = 0; j < SIZE; j++) 84*521adf53SAnton Blanchard s1[j] = random(); 85*521adf53SAnton Blanchard 86*521adf53SAnton Blanchard memcpy(s2, s1, SIZE); 87*521adf53SAnton Blanchard 88*521adf53SAnton Blanchard /* change multiple bytes, 1/8 of total */ 89*521adf53SAnton Blanchard for (j = 0; j < SIZE / 8; j++) { 90*521adf53SAnton Blanchard change = random() % SIZE; 91*521adf53SAnton Blanchard s2[change] = random() & 0xff; 92*521adf53SAnton Blanchard } 93*521adf53SAnton Blanchard 94*521adf53SAnton Blanchard test_one(s1, s2); 95*521adf53SAnton Blanchard } 96*521adf53SAnton Blanchard 97*521adf53SAnton Blanchard return 0; 98*521adf53SAnton Blanchard } 99*521adf53SAnton Blanchard 100*521adf53SAnton Blanchard int main(void) 101*521adf53SAnton Blanchard { 102*521adf53SAnton Blanchard return test_harness(testcase, "memcmp"); 103*521adf53SAnton Blanchard } 104