(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
builtin-stringop-chk-7.c
       1  /* Verify that -Wstringop-overflow doesn't cause false positives for
       2     anti-ranges.  Note that not all of the statements below result in
       3     the memset argument being represented as an anti-range.
       4  
       5     { dg-do compile }
       6     { dg-options "-O2 -Wstringop-overflow" } */
       7  
       8  #define SCHAR_MAX __SCHAR_MAX__
       9  #define UCHAR_MAX (SCHAR_MAX * 2 + 1)
      10  
      11  #define SHRT_MAX  __SHRT_MAX__
      12  #define USHRT_MAX (SHRT_MAX * 2U + 1)
      13  
      14  #define INT_MAX   __INT_MAX__
      15  #define UINT_MAX  (INT_MAX * 2U + 1)
      16  
      17  #define LONG_MAX __LONG_MAX__
      18  #define ULONG_MAX (LONG_MAX * 2LU + 1)
      19  
      20  #define PTRDIFF_MAX __PTRDIFF_MAX__
      21  #define SIZE_MAX    __SIZE_MAX__
      22  
      23  typedef __PTRDIFF_TYPE__ ptrdiff_t;
      24  typedef __SIZE_TYPE__    size_t;
      25  
      26  #define TEST_AR_1(T, prefix)			\
      27    void test_ar_1_ ## prefix (void *d, T n)	\
      28    {						\
      29      if (n == prefix ## _MAX - 1)		\
      30        n = prefix ## _MAX - 2;			\
      31      __builtin_memset (d, 0, n);			\
      32    } typedef void dummy
      33  
      34  #define TEST_AR_2(T, prefix)					\
      35    void test_ar_2_ ## prefix (void *d, T n)			\
      36    {								\
      37      if (prefix ## _MAX - 2 <= n && n <= prefix ## _MAX - 1)	\
      38        n = prefix ## _MAX - 3;					\
      39      __builtin_memset (d, 0, n);					\
      40    } typedef void dummy
      41  
      42  /* Verify antirange where MIN == MAX.  */
      43  TEST_AR_1 (signed char, SCHAR);
      44  TEST_AR_1 (unsigned char, UCHAR);
      45  
      46  TEST_AR_1 (short, SHRT);
      47  TEST_AR_1 (unsigned short, USHRT);
      48  
      49  TEST_AR_1 (int, INT);
      50  TEST_AR_1 (unsigned, UINT);
      51  
      52  TEST_AR_1 (long, LONG);
      53  TEST_AR_1 (unsigned long, ULONG);
      54  
      55  TEST_AR_1 (ptrdiff_t, PTRDIFF);
      56  TEST_AR_1 (size_t, SIZE);
      57  
      58  /* Verify antirange where MIN < MAX.  */
      59  TEST_AR_2 (signed char, SCHAR);
      60  TEST_AR_2 (unsigned char, UCHAR);
      61  
      62  TEST_AR_2 (short, SHRT);
      63  TEST_AR_2 (unsigned short, USHRT);
      64  
      65  TEST_AR_2 (int, INT);
      66  TEST_AR_2 (unsigned, UINT);
      67  
      68  TEST_AR_2 (long, LONG);
      69  TEST_AR_2 (unsigned long, ULONG);
      70  
      71  TEST_AR_2 (ptrdiff_t, PTRDIFF);
      72  TEST_AR_2 (size_t, SIZE);