modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/strncmp-1.c (about) 1 /* { dg-xfail-if "kernel strncmp does not perform unsigned comparisons" { vxworks_kernel } } */ 2 /* Copyright (C) 2002 Free Software Foundation. 3 4 Test strncmp with various combinations of pointer alignments and lengths to 5 make sure any optimizations in the library are correct. 6 7 Written by Michael Meissner, March 9, 2002. */ 8 9 #include <string.h> 10 #include <stddef.h> 11 12 #ifndef MAX_OFFSET 13 #define MAX_OFFSET (sizeof (long long)) 14 #endif 15 16 #ifndef MAX_TEST 17 #define MAX_TEST (8 * sizeof (long long)) 18 #endif 19 20 #ifndef MAX_EXTRA 21 #define MAX_EXTRA (sizeof (long long)) 22 #endif 23 24 #define MAX_LENGTH (MAX_OFFSET + MAX_TEST + MAX_EXTRA) 25 26 static union { 27 unsigned char buf[MAX_LENGTH]; 28 long long align_int; 29 long double align_fp; 30 } u1, u2; 31 32 void 33 test (const unsigned char *s1, const unsigned char *s2, size_t len, int expected) 34 { 35 int value = strncmp ((char *) s1, (char *) s2, len); 36 37 if (expected < 0 && value >= 0) 38 abort (); 39 else if (expected == 0 && value != 0) 40 abort (); 41 else if (expected > 0 && value <= 0) 42 abort (); 43 } 44 45 main () 46 { 47 size_t off1, off2, len, i; 48 unsigned char *buf1, *buf2; 49 unsigned char *mod1, *mod2; 50 unsigned char *p1, *p2; 51 52 for (off1 = 0; off1 < MAX_OFFSET; off1++) 53 for (off2 = 0; off2 < MAX_OFFSET; off2++) 54 for (len = 0; len < MAX_TEST; len++) 55 { 56 p1 = u1.buf; 57 for (i = 0; i < off1; i++) 58 *p1++ = '\0'; 59 60 buf1 = p1; 61 for (i = 0; i < len; i++) 62 *p1++ = 'a'; 63 64 mod1 = p1; 65 for (i = 0; i < MAX_EXTRA; i++) 66 *p1++ = 'x'; 67 68 p2 = u2.buf; 69 for (i = 0; i < off2; i++) 70 *p2++ = '\0'; 71 72 buf2 = p2; 73 for (i = 0; i < len; i++) 74 *p2++ = 'a'; 75 76 mod2 = p2; 77 for (i = 0; i < MAX_EXTRA; i++) 78 *p2++ = 'x'; 79 80 mod1[0] = '\0'; 81 mod2[0] = '\0'; 82 test (buf1, buf2, MAX_LENGTH, 0); 83 test (buf1, buf2, len, 0); 84 85 mod1[0] = 'a'; 86 mod1[1] = '\0'; 87 mod2[0] = '\0'; 88 test (buf1, buf2, MAX_LENGTH, +1); 89 test (buf1, buf2, len, 0); 90 91 mod1[0] = '\0'; 92 mod2[0] = 'a'; 93 mod2[1] = '\0'; 94 test (buf1, buf2, MAX_LENGTH, -1); 95 test (buf1, buf2, len, 0); 96 97 mod1[0] = 'b'; 98 mod1[1] = '\0'; 99 mod2[0] = 'c'; 100 mod2[1] = '\0'; 101 test (buf1, buf2, MAX_LENGTH, -1); 102 test (buf1, buf2, len, 0); 103 104 mod1[0] = 'c'; 105 mod1[1] = '\0'; 106 mod2[0] = 'b'; 107 mod2[1] = '\0'; 108 test (buf1, buf2, MAX_LENGTH, +1); 109 test (buf1, buf2, len, 0); 110 111 mod1[0] = 'b'; 112 mod1[1] = '\0'; 113 mod2[0] = (unsigned char)'\251'; 114 mod2[1] = '\0'; 115 test (buf1, buf2, MAX_LENGTH, -1); 116 test (buf1, buf2, len, 0); 117 118 mod1[0] = (unsigned char)'\251'; 119 mod1[1] = '\0'; 120 mod2[0] = 'b'; 121 mod2[1] = '\0'; 122 test (buf1, buf2, MAX_LENGTH, +1); 123 test (buf1, buf2, len, 0); 124 125 mod1[0] = (unsigned char)'\251'; 126 mod1[1] = '\0'; 127 mod2[0] = (unsigned char)'\252'; 128 mod2[1] = '\0'; 129 test (buf1, buf2, MAX_LENGTH, -1); 130 test (buf1, buf2, len, 0); 131 132 mod1[0] = (unsigned char)'\252'; 133 mod1[1] = '\0'; 134 mod2[0] = (unsigned char)'\251'; 135 mod2[1] = '\0'; 136 test (buf1, buf2, MAX_LENGTH, +1); 137 test (buf1, buf2, len, 0); 138 } 139 140 exit (0); 141 }