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  }