memcmp.c 1.8 KB

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