131
|
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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "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-overflow=]" "sprintf" } */
|
|
123 }
|