modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/builtins/strnlen.c (about)

     1  /* PR tree-optimization/81384 - built-in form of strnlen missing
     2     Test to verify that strnlen built-in expansion works correctly.  */
     3  
     4  #define PTRDIFF_MAX __PTRDIFF_MAX__
     5  #define SIZE_MAX    __SIZE_MAX__
     6  #define NOIPA __attribute__ ((noipa))
     7  
     8  typedef __SIZE_TYPE__ size_t;
     9  
    10  extern void abort (void);
    11  extern size_t strnlen (const char *, size_t);
    12  
    13  #define A(expr)							\
    14    ((expr) ? (void)0						\
    15     : (__builtin_printf ("assertion on line %i failed: %s\n",	\
    16  			__LINE__, #expr),			\
    17        abort ()))
    18  
    19  NOIPA void test_strnlen_str_cst (void)
    20  {
    21    A (strnlen ("", 0) == 0);
    22    A (strnlen ("", 1) == 0);
    23    A (strnlen ("", 9) == 0);
    24    A (strnlen ("", PTRDIFF_MAX) == 0);
    25    A (strnlen ("", SIZE_MAX) == 0);
    26    A (strnlen ("", -1) == 0);
    27  
    28    A (strnlen ("1", 0) == 0);
    29    A (strnlen ("1", 1) == 1);
    30    A (strnlen ("1", 9) == 1);
    31    A (strnlen ("1", PTRDIFF_MAX) == 1);
    32    A (strnlen ("1", SIZE_MAX) == 1);
    33    A (strnlen ("1", -2) == 1);
    34  
    35    A (strnlen ("123", 0) == 0);
    36    A (strnlen ("123", 1) == 1);
    37    A (strnlen ("123", 2) == 2);
    38    A (strnlen ("123", 3) == 3);
    39    A (strnlen ("123", 9) == 3);
    40    A (strnlen ("123", PTRDIFF_MAX) == 3);
    41    A (strnlen ("123", SIZE_MAX) == 3);
    42    A (strnlen ("123", -2) == 3);
    43  }
    44  
    45  NOIPA void test_strnlen_str_range (size_t x)
    46  {
    47    size_t r_0_3 = x & 3;
    48    size_t r_1_3 = r_0_3 | 1;
    49    size_t r_2_3 = r_0_3 | 2;
    50  
    51    A (strnlen ("",     r_0_3) == 0);
    52    A (strnlen ("1",    r_0_3) <= 1);
    53    A (strnlen ("12",   r_0_3) <= 2);
    54    A (strnlen ("123",  r_0_3) <= 3);
    55    A (strnlen ("1234", r_0_3) <= 3);
    56  
    57    A (strnlen ("",     r_1_3) == 0);
    58    A (strnlen ("1",    r_1_3) == 1);
    59    A (strnlen ("12",   r_1_3) <= 2);
    60    A (strnlen ("123",  r_1_3) <= 3);
    61    A (strnlen ("1234", r_1_3) <= 3);
    62  
    63    A (strnlen ("",     r_2_3) == 0);
    64    A (strnlen ("1",    r_2_3) == 1);
    65    A (strnlen ("12",   r_2_3) == 2);
    66    A (strnlen ("123",  r_2_3) <= 3);
    67    A (strnlen ("1234", r_2_3) <= 3);
    68  }
    69  
    70  NOIPA void test_strnlen_str_range_side_effect (size_t x)
    71  {
    72    size_t r_0_3 = x & 3;
    73    size_t r_1_3 = r_0_3 | 1;
    74    size_t r_2_3 = r_0_3 | 2;
    75    size_t n = r_2_3;
    76  
    77    int i = 0;
    78  
    79    A (strnlen ("1234" + i++, n) <= 3);
    80    A (i == 1);
    81  
    82    A (strnlen ("1234", n++) <= 3);
    83    A (n == r_2_3 + 1);
    84  }
    85  
    86  void
    87  main_test (void)
    88  {
    89    test_strnlen_str_cst ();
    90    test_strnlen_str_range ((size_t)"");
    91    test_strnlen_str_range_side_effect ((size_t)"");
    92  }