builtins.c (fold_builtin_strlen): Remove TODO comment.
[official-gcc.git] / gcc / testsuite / gcc.dg / warn-strlen-no-nul.c
blob997dfc3540f2e30289f43cd0e48bead4cbc1ca1c
1 /* PR tree-optimization/86552 - missing warning for reading past the end
2 of non-string arrays
3 { dg-do compile }
4 { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
6 extern __SIZE_TYPE__ strlen (const char*);
8 const char a[5] = "12345"; /* { dg-message "declared here" } */
10 int v0 = 0;
11 int v1 = 1;
12 volatile int v2;
14 void sink (int, ...);
16 #define CONCAT(a, b) a ## b
17 #define CAT(a, b) CONCAT(a, b)
19 #define T(str) \
20 __attribute__ ((noipa)) \
21 void CAT (test_, __LINE__) (void) { \
22 int i0 = 0, i1 = i0 + 1, i2 = i1 + 1, i3 = i2 + 1; \
23 sink (strlen (str), i0, i1, i2, i3); \
24 } typedef void dummy_type
26 T (a); /* { dg-warning "argument missing terminating nul" } */
27 T (&a[0]); /* { dg-warning "nul" } */
28 T (&a[0] + 1); /* { dg-warning "nul" } */
29 T (&a[1]); /* { dg-warning "nul" } */
30 T (&a[v0]); /* { dg-warning "nul" } */
31 T (&a[v0] + 1); /* { dg-warning "nul" } */
34 const char b[][5] = { /* { dg-message "declared here" } */
35 "12", "123", "1234", "54321"
38 T (b[0]);
39 T (b[1]);
40 T (b[2]);
41 T (b[3]); /* { dg-warning "nul" } */
43 T (b[i0]);
44 T (b[i1]);
45 T (b[i2]);
46 T (b[i3]); /* { dg-warning "nul" } */
48 T (b[v0]);
50 T (&b[i2][i1]);
51 T (&b[i2][i1] + i1);
52 T (&b[i2][v0]);
53 T (&b[i2][i1] + v0);
55 T (&b[2][1]);
56 T (&b[2][1] + i1);
57 T (&b[2][i0]);
58 T (&b[2][1] + i0);
60 T (&b[2][1]);
61 T (&b[2][1] + v0);
62 T (&b[2][v0]);
64 T (&b[3][1]); /* { dg-warning "nul" } */
65 T (&b[3][1] + 1); /* { dg-warning "nul" } */
66 T (&b[3][1] + i1); /* { dg-warning "nul" } */
67 T (&b[3][v0]); /* { dg-warning "nul" } */
68 T (&b[3][1] + v0); /* { dg-warning "nul" } */
69 T (&b[3][v0] + v1); /* { dg-warning "nul" } */
71 T (&b[i3][i1]); /* { dg-warning "nul" } */
72 T (&b[i3][i1] + 1); /* { dg-warning "nul" } */
73 T (&b[i3][i1] + i1); /* { dg-warning "nul" } */
74 T (&b[i3][v0]); /* { dg-warning "nul" "pr86919" { xfail *-*-* } } */
75 T (&b[i3][i1] + v0); /* { dg-warning "nul" "pr86919" { xfail *-*-* } } */
76 T (&b[i3][v0] + v1); /* { dg-warning "nul" "pr86919" { xfail *-*-* } } */
78 T (v0 ? "" : b[0]);
79 T (v0 ? "" : b[1]);
80 T (v0 ? "" : b[2]);
81 T (v0 ? "" : b[3]); /* { dg-warning "nul" } */
82 T (v0 ? b[0] : "");
83 T (v0 ? b[1] : "");
84 T (v0 ? b[2] : "");
85 T (v0 ? b[3] : ""); /* { dg-warning "nul" } */
87 T (v0 ? "" : b[i0]);
88 T (v0 ? "" : b[i1]);
89 T (v0 ? "" : b[i2]);
90 /* The following is diagnosed but the warning location is wrong
91 (the PRE pass loses it). */
92 T (v0 ? "" : b[i3]); /* { dg-warning "nul" } */
93 T (v0 ? b[i0] : "");
94 T (v0 ? b[i1] : "");
95 T (v0 ? b[i2] : "");
96 T (v0 ? b[i3] : ""); /* { dg-warning "nul" } */
98 T (v0 ? "1234" : b[3]); /* { dg-warning "nul" } */
99 T (v0 ? "1234" : b[i3]); /* { dg-warning "nul" } */
100 T (v0 ? b[3] : "1234"); /* { dg-warning "nul" } */
101 T (v0 ? b[i3] : "1234"); /* { dg-warning "nul" } */
103 T (v0 ? a : b[3]); /* { dg-warning "nul" } */
104 T (v0 ? b[0] : b[2]);
105 T (v0 ? b[2] : b[3]); /* { dg-warning "nul" } */
106 T (v0 ? b[3] : b[2]); /* { dg-warning "nul" } */
108 T (v0 ? a : b[i3]); /* { dg-warning "nul" } */
109 T (v0 ? b[i0] : b[i2]);
110 T (v0 ? b[i2] : b[i3]); /* { dg-warning "nul" } */
111 T (v0 ? b[i3] : b[i2]); /* { dg-warning "nul" } */
113 T (v0 ? b[0] : &b[3][0] + 1); /* { dg-warning "nul" } */
114 T (v0 ? b[0] : &b[3][0] + i1); /* { dg-warning "nul" } */
115 T (v0 ? b[1] : &b[3][1] + v0); /* { dg-warning "nul" } */
117 T (v0 ? b[i0] : &b[i3][i0] + i1); /* { dg-warning "nul" } */
118 T (v0 ? b[i0] : &b[i3][i0] + i1); /* { dg-warning "nul" } */
119 T (v0 ? b[i1] : &b[i3][i1] + v0); /* { dg-warning "nul" } */
121 T (v0 ? &b[3][1] + v0 : b[2]); /* { dg-warning "nul" } */
122 T (v0 ? &b[3][v0] : &b[3][v1]); /* { dg-warning "nul" } */
125 struct A { char a[5], b[5]; };
127 const struct A s = { "1234", "12345" };
129 T (s.a);
130 T (&s.a[0]);
131 T (&s.a[0] + 1);
132 T (&s.a[0] + v0);
133 T (&s.a[1]);
134 T (&s.a[1] + 1);
135 T (&s.a[1] + v0);
137 T (&s.a[i0]);
138 T (&s.a[i0] + i1);
139 T (&s.a[i0] + v0);
140 T (&s.a[i1]);
141 T (&s.a[i1] + i1);
142 T (&s.a[i1] + v0);
144 T (s.b); /* { dg-warning "nul" } */
145 T (&s.b[0]); /* { dg-warning "nul" } */
146 T (&s.b[0] + 1); /* { dg-warning "nul" } */
147 T (&s.b[0] + v0); /* { dg-warning "nul" } */
148 T (&s.b[1]); /* { dg-warning "nul" } */
149 T (&s.b[1] + 1); /* { dg-warning "nul" } */
150 T (&s.b[1] + i0); /* { dg-warning "nul" } */
151 T (&s.b[1] + v0); /* { dg-warning "nul" } */
153 T (&s.b[i0]); /* { dg-warning "nul" } */
154 T (&s.b[i0] + i1); /* { dg-warning "nul" } */
155 T (&s.b[i0] + v0); /* { dg-warning "nul" "pr86919" { xfail *-*-* } } */
156 T (&s.b[i1]); /* { dg-warning "nul" } */
157 T (&s.b[i1] + i1); /* { dg-warning "nul" } */
158 T (&s.b[i1] + v0); /* { dg-warning "nul" "pr86919" { xfail *-*-* } } */
160 struct B { struct A a[2]; };
162 const struct B ba[] = {
163 { { { "123", "12345" }, { "12345", "123" } } },
164 { { { "12345", "123" }, { "123", "12345" } } },
165 { { { "1", "12" }, { "123", "1234" } } },
166 { { { "123", "1234" }, { "12345", "12" } } }
169 T (ba[0].a[0].a);
170 T (&ba[0].a[0].a[0]);
171 T (&ba[0].a[0].a[0] + 1);
172 T (&ba[0].a[0].a[0] + v0);
173 T (&ba[0].a[0].a[1]);
174 T (&ba[0].a[0].a[1] + 1);
175 T (&ba[0].a[0].a[1] + v0);
177 T (ba[0].a[0].b); /* { dg-warning "nul" } */
178 T (&ba[0].a[0].b[0]); /* { dg-warning "nul" } */
179 T (&ba[0].a[0].b[0] + 1); /* { dg-warning "nul" } */
180 T (&ba[0].a[0].b[0] + v0); /* { dg-warning "nul" } */
181 T (&ba[0].a[0].b[1]); /* { dg-warning "nul" } */
182 T (&ba[0].a[0].b[1] + 1); /* { dg-warning "nul" } */
183 T (&ba[0].a[0].b[1] + v0); /* { dg-warning "nul" } */
185 T (ba[0].a[1].a); /* { dg-warning "nul" } */
186 T (&ba[0].a[1].a[0]); /* { dg-warning "nul" } */
187 T (&ba[0].a[1].a[0] + 1); /* { dg-warning "nul" } */
188 T (&ba[0].a[1].a[0] + v0); /* { dg-warning "nul" } */
189 T (&ba[0].a[1].a[1]); /* { dg-warning "nul" } */
190 T (&ba[0].a[1].a[1] + 1); /* { dg-warning "nul" } */
191 T (&ba[0].a[1].a[1] + v0); /* { dg-warning "nul" } */
193 T (ba[0].a[1].b);
194 T (&ba[0].a[1].b[0]);
195 T (&ba[0].a[1].b[0] + 1);
196 T (&ba[0].a[1].b[0] + v0);
197 T (&ba[0].a[1].b[1]);
198 T (&ba[0].a[1].b[1] + 1);
199 T (&ba[0].a[1].b[1] + v0);
202 T (ba[1].a[0].a); /* { dg-warning "nul" } */
203 T (&ba[1].a[0].a[0]); /* { dg-warning "nul" } */
204 T (&ba[1].a[0].a[0] + 1); /* { dg-warning "nul" } */
205 T (&ba[1].a[0].a[0] + v0); /* { dg-warning "nul" } */
206 T (&ba[1].a[0].a[1]); /* { dg-warning "nul" } */
207 T (&ba[1].a[0].a[1] + 1); /* { dg-warning "nul" } */
208 T (&ba[1].a[0].a[1] + v0); /* { dg-warning "nul" } */
210 T (ba[1].a[0].b);
211 T (&ba[1].a[0].b[0]);
212 T (&ba[1].a[0].b[0] + 1);
213 T (&ba[1].a[0].b[0] + v0);
214 T (&ba[1].a[0].b[1]);
215 T (&ba[1].a[0].b[1] + 1);
216 T (&ba[1].a[0].b[1] + v0);
218 T (ba[1].a[1].a);
219 T (&ba[1].a[1].a[0]);
220 T (&ba[1].a[1].a[0] + 1);
221 T (&ba[1].a[1].a[0] + v0);
222 T (&ba[1].a[1].a[1]);
223 T (&ba[1].a[1].a[1] + 1);
224 T (&ba[1].a[1].a[1] + v0);
226 T (ba[1].a[1].b); /* { dg-warning "nul" } */
227 T (&ba[1].a[1].b[0]); /* { dg-warning "nul" } */
228 T (&ba[1].a[1].b[0] + 1); /* { dg-warning "nul" } */
229 T (&ba[1].a[1].b[0] + v0); /* { dg-warning "nul" } */
230 T (&ba[1].a[1].b[1]); /* { dg-warning "nul" } */
231 T (&ba[1].a[1].b[1] + 1); /* { dg-warning "nul" } */
232 T (&ba[1].a[1].b[1] + v0); /* { dg-warning "nul" } */
235 T (ba[2].a[0].a);
236 T (&ba[2].a[0].a[0]);
237 T (&ba[2].a[0].a[0] + 1);
238 T (&ba[2].a[0].a[0] + v0);
239 T (&ba[2].a[0].a[1]);
240 T (&ba[2].a[0].a[1] + 1);
241 T (&ba[2].a[0].a[1] + v0);
243 T (ba[2].a[0].b);
244 T (&ba[2].a[0].b[0]);
245 T (&ba[2].a[0].b[0] + 1);
246 T (&ba[2].a[0].b[0] + v0);
247 T (&ba[2].a[0].b[1]);
248 T (&ba[2].a[0].b[1] + 1);
249 T (&ba[2].a[0].b[1] + v0);
251 T (ba[2].a[1].a);
252 T (&ba[2].a[1].a[0]);
253 T (&ba[2].a[1].a[0] + 1);
254 T (&ba[2].a[1].a[0] + v0);
255 T (&ba[2].a[1].a[1]);
256 T (&ba[2].a[1].a[1] + 1);
257 T (&ba[2].a[1].a[1] + v0);
260 T (ba[3].a[0].a);
261 T (&ba[3].a[0].a[0]);
262 T (&ba[3].a[0].a[0] + 1);
263 T (&ba[3].a[0].a[0] + v0);
264 T (&ba[3].a[0].a[1]);
265 T (&ba[3].a[0].a[1] + 1);
266 T (&ba[3].a[0].a[1] + v0);
268 T (ba[3].a[0].b);
269 T (&ba[3].a[0].b[0]);
270 T (&ba[3].a[0].b[0] + 1);
271 T (&ba[3].a[0].b[0] + v0);
272 T (&ba[3].a[0].b[1]);
273 T (&ba[3].a[0].b[1] + 1);
274 T (&ba[3].a[0].b[1] + v0);
276 T (ba[3].a[1].a); /* { dg-warning "nul" } */
277 T (&ba[3].a[1].a[0]); /* { dg-warning "nul" } */
278 T (&ba[3].a[1].a[0] + 1); /* { dg-warning "nul" } */
279 T (&ba[3].a[1].a[0] + v0); /* { dg-warning "nul" } */
280 T (&ba[3].a[1].a[1]); /* { dg-warning "nul" } */
281 T (&ba[3].a[1].a[1] + 1); /* { dg-warning "nul" } */
282 T (&ba[3].a[1].a[1] + v0); /* { dg-warning "nul" } */
284 T (ba[3].a[1].b);
285 T (&ba[3].a[1].b[0]);
286 T (&ba[3].a[1].b[0] + 1);
287 T (&ba[3].a[1].b[0] + v0);
288 T (&ba[3].a[1].b[1]);
289 T (&ba[3].a[1].b[1] + 1);
290 T (&ba[3].a[1].b[1] + v0);
293 T (v0 ? ba[0].a[0].a : ba[0].a[0].b); /* { dg-warning "nul" } */
294 T (v0 ? ba[0].a[0].a : ba[0].a[0].b); /* { dg-warning "nul" } */
296 T (v0 ? &ba[0].a[0].a[0] : &ba[3].a[1].a[0]); /* { dg-warning "nul" } */
297 T (v0 ? &ba[3].a[1].a[1] : ba[0].a[0].a); /* { dg-warning "nul" } */
299 T (v0 ? ba[0].a[0].a : ba[0].a[1].b);
300 T (v0 ? ba[0].a[1].b : ba[0].a[0].a);
302 T (v2 ? b[1] : &b[3][1] + v2); /* { dg-warning "nul" } */
303 T (v2 ? &b[3][1] + v2 : b[2]); /* { dg-warning "nul" } */
304 T (v2 ? &b[3][v2] : &b[2][v2]); /* { dg-warning "nul" } */