Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/gcc.dg/attr-nonstring.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
111:04ced10e8804 | 131:84e7813d76e9 |
---|---|
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 } |