(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
attr-nonstring.c
       1  /* PR middle-end/85359 - duplicate -Wstringop-overflow for a strcmp call
       2     with a nonstring pointer
       3     { dg-do compile }
       4     { dg-options "-O2 -Wall" } */
       5  
       6  typedef __SIZE_TYPE__       size_t;
       7  typedef __builtin_va_list   va_list;
       8  
       9  int printf (const char*, ...);
      10  int puts (const char*);
      11  int puts_unlocked (const char*);
      12  int sprintf (char*, const char*, ...);
      13  int snprintf (char*, size_t, const char*, ...);
      14  int vsprintf (char*, const char*, va_list);
      15  int vsnprintf (char*, size_t, const char*, va_list);
      16  
      17  int strcmp (const char*, const char*);
      18  int strncmp (const char*, const char*, size_t);
      19  
      20  char* stpcpy (char*, const char*);
      21  char* stpncpy (char*, const char*, size_t);
      22  
      23  char* strcat (char*, const char*);
      24  char* strncat (char*, const char*, size_t);
      25  
      26  char* strcpy (char*, const char*);
      27  char* strncpy (char*, const char*, size_t);
      28  
      29  char* strchr (const char*, int);
      30  char* strrchr (const char*, int);
      31  char* strstr (const char*, const char*);
      32  char* strdup (const char*);
      33  size_t strlen (const char*);
      34  size_t strnlen (const char*, size_t);
      35  char* strndup (const char*, size_t);
      36  
      37  #define NONSTRING __attribute__ ((nonstring))
      38  
      39  extern char ns5[5] NONSTRING;
      40  
      41  int strcmp_nonstring_1 (NONSTRING const char *a, const char *b)
      42  {
      43    /* dg-warning matches one or more instances of the warning so it's
      44       no good on its own.  Use dg-regexp instead to verify that just
      45       one instance of the warning is issued.  See gcc.dg/pr64223-1
      46       for a different approach.  */
      47    return strcmp (a, b);  /* { dg-regexp "\[^\n\r\]+: warning: .strcmp. argument 1 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "strcmp" } */
      48  }
      49  
      50  int strcmp_nonstring_2 (const char *a, NONSTRING const char *b)
      51  {
      52    return strcmp (a, b);  /* { dg-regexp "\[^\n\r\]+: warning: .strcmp. argument 2 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "strcmp" } */
      53  }
      54  
      55  int strncmp_nonstring_1 (const char *s)
      56  {
      57    return strncmp (s, ns5, sizeof ns5 + 1);  /* { dg-regexp "\[^\n\r\]+: warning: .strncmp. argument 2 declared attribute .nonstring. \[^\n\r\]+ \\\[-Wstringop-overread\[^\n\r\]*" "strncmp" } */
      58  }
      59  
      60  int strncmp_nonstring_2 (const char *s)
      61  {
      62    return strncmp (ns5, s, sizeof ns5 + 1);  /* { dg-regexp "\[^\n\r\]+: warning: .strncmp. argument 1 declared attribute .nonstring. \[^\n\r\]+ \\\[-Wstringop-overread\[^\n\r\]*" "strncmp" } */
      63  }
      64  
      65  char* stpcpy_nonstring (char *d, NONSTRING const char *s)
      66  {
      67    return stpcpy (d, s);  /* { dg-regexp "\[^\n\r\]+: warning: .stpcpy. argument 2 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "stpcpy" } */
      68  }
      69  
      70  char* stpncpy_nonstring (char *d)
      71  {
      72    return stpncpy (d, ns5, sizeof ns5 + 1);  /* { dg-regexp "\[^\n\r\]+: warning: .stpncpy. argument 2 declared attribute .nonstring. \[^\n\r\]+ \\\[-Wstringop-overread\[^\n\r\]*" "stpncpy" } */
      73  }
      74  
      75  char* strchr_nonstring (NONSTRING const char *s, int c)
      76  {
      77    return strchr (s, c);  /* { dg-regexp "\[^\n\r\]+: warning: .strchr. argument 1 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "strchr" } */
      78  }
      79  
      80  char* strrchr_nonstring (NONSTRING const char *s, int c)
      81  {
      82    return strrchr (s, c);  /* { dg-regexp "\[^\n\r\]+: warning: .strrchr. argument 1 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "strrchr" } */
      83  }
      84  
      85  char* strcpy_nonstring (char *d, NONSTRING const char *s)
      86  {
      87    return strcpy (d, s);  /* { dg-regexp "\[^\n\r\]+: warning: .strcpy. argument 2 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "strcpy" } */
      88  }
      89  
      90  char* strncpy_nonstring (char *d)
      91  {
      92    return strncpy (d, ns5, sizeof ns5 + 1);  /* { dg-regexp "\[^\n\r\]+: warning: .strncpy. argument 2 declared attribute .nonstring. \[^\n\r\]+ \\\[-Wstringop-overread\[^\n\r\]*" "strncpy" } */
      93  }
      94  
      95  char* strstr_nonstring_1 (NONSTRING const char *a, const char *b)
      96  {
      97    return strstr (a, b);  /* { dg-regexp "\[^\n\r\]+: warning: .strstr. argument 1 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "strstr" } */
      98  }
      99  
     100  char* strstr_nonstring_2 (const char *a, NONSTRING const char *b)
     101  {
     102    return strstr (a, b);  /* { dg-regexp "\[^\n\r\]+: warning: .strstr. argument 2 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "strstr" } */
     103  }
     104  
     105  char* stdup_nonstring (NONSTRING const char *s)
     106  {
     107    return strdup (s);  /* { dg-regexp "\[^\n\r\]+: warning: .strdup. argument 1 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "strdup" } */
     108  }
     109  
     110  size_t strlen_nonstring (NONSTRING const char *s)
     111  {
     112    return strlen (s);  /* { dg-regexp "\[^\n\r\]+: warning: .strlen. argument 1 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "strlen" } */
     113  }
     114  
     115  int printf_nonstring (NONSTRING const char *s)
     116  {
     117    return printf (s);  /* { dg-regexp "\[^\n\r\]+: warning: .printf. argument 1 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "printf" } */
     118  }
     119  
     120  int sprintf_nonstring_2 (char *d, NONSTRING const char *s)
     121  {
     122    return sprintf (d, s);  /* { dg-regexp "\[^\n\r\]+: warning: .sprintf. argument 2 declared attribute .nonstring. \\\[-Wstringop-overread\[^\n\r\]*" "sprintf" } */
     123  }