1 /* PR tree-optimization/86552 - missing warning for reading past the end
4 { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
6 typedef __SIZE_TYPE__
size_t;
7 extern size_t strnlen (const char*, size_t);
9 const char a
[5] = "12345"; /* { dg-message "declared here" } */
10 enum { asz
= sizeof a
};
17 #define CONCAT(a, b) a ## b
18 #define CAT(a, b) CONCAT(a, b)
21 __attribute__ ((noipa)) \
22 void CAT (test_, __LINE__) (void) { \
23 int i0 = 0, i1 = i0 + 1, i2 = i1 + 1, i3 = i2 + 1; \
24 sink (strnlen (str, n), i0, i1, i2, i3); \
25 } typedef void dummy_type
32 T (&a
[0] + 1, asz
); /* { dg-warning "specified bound 5 exceeds the size 4 of unterminated array" } */
33 T (&a
[1], asz
); /* { dg-warning "specified bound 5 exceeds the size 4 of unterminated array" } */
35 T (&a
[v0
], asz
); /* { dg-warning "specified bound 5 may exceed the size of at most 5 of unterminated array" } */
36 T (&a
[v0
] + 1, asz
); /* { dg-warning "specified bound 5 may exceed the size of at most 5 of unterminated array" } */
38 T (a
, asz
+ 1); /* { dg-warning "specified bound 6 exceeds the size 5 of unterminated array" } */
39 T (&a
[0], asz
+ 1); /* { dg-warning "unterminated" } */
40 T (&a
[0] + 1, asz
- 1);
41 T (&a
[0] + 1, asz
+ 1); /* { dg-warning "unterminated" } */
42 T (&a
[1], asz
+ 1); /* { dg-warning "unterminated" } */
43 T (&a
[v0
], asz
+ 1); /* { dg-warning "unterminated" } */
44 T (&a
[v0
] + 1, asz
+ 1); /* { dg-warning "unterminated" } */
47 const char b
[][5] = { /* { dg-message "declared here" } */
48 "12", "123", "1234", "54321"
50 enum { bsz
= sizeof b
[0] };
65 T (b
[3], bsz
+ 1); /* { dg-warning "unterminated" } */
75 T (b
[i3
], bsz
+ 1); /* { dg-warning "unterminated" } */
81 T (&b
[i2
][i1
] + i1
, bsz
);
83 T (&b
[i2
][i1
] + v0
, bsz
);
85 T (&b
[i2
][i1
], bsz
+ 1);
86 T (&b
[i2
][i1
] + i1
, bsz
+ 1);
87 T (&b
[i2
][v0
], bsz
+ 1);
88 T (&b
[i2
][i1
] + v0
, bsz
+ 1);
91 T (&b
[2][1] + i1
, bsz
);
93 T (&b
[2][1] + i0
, bsz
);
94 T (&b
[2][1] + v0
, bsz
);
97 T (&b
[2][1], bsz
+ 1);
98 T (&b
[2][1] + i1
, bsz
+ 1);
99 T (&b
[2][i0
], bsz
+ 1);
100 T (&b
[2][1] + i0
, bsz
+ 1);
101 T (&b
[2][1] + v0
, bsz
+ 1);
102 T (&b
[2][v0
], bsz
+ 1);
104 T (&b
[3][1], bsz
); /* { dg-warning "unterminated" } */
105 T (&b
[3][1], bsz
- 1);
106 T (&b
[3][1] + 1, bsz
); /* { dg-warning "unterminated" } */
107 T (&b
[3][1] + 1, bsz
- 1); /* { dg-warning "unterminated" } */
108 T (&b
[3][1] + 1, bsz
- 2);
109 T (&b
[3][1] + i1
, bsz
); /* { dg-warning "unterminated" } */
110 T (&b
[3][1] + i1
, bsz
- i1
); /* { dg-warning "unterminated" } */
111 T (&b
[3][1] + i1
, bsz
- i2
);
113 T (&b
[3][1] + v0
, bsz
); /* { dg-warning "specified bound 5 exceeds the size of at most 4 of unterminated array" } */
114 T (&b
[3][v0
] + v1
, bsz
); /* { dg-warning "specified bound 5 may exceed the size of at most 4 of unterminated array" "pr?????" { xfail *-*-* } } */
116 T (&b
[3][1], bsz
+ 1); /* { dg-warning "unterminated" } */
117 T (&b
[3][1] + 1, bsz
+ 1); /* { dg-warning "unterminated" } */
118 T (&b
[3][1] + i1
, bsz
+ 1); /* { dg-warning "unterminated" } */
119 T (&b
[3][v0
], bsz
+ 1); /* { dg-warning "unterminated" "pr86936" { xfail *-*-* } } */
120 T (&b
[3][1] + v0
, bsz
+ 1); /* { dg-warning "unterminated" } */
121 T (&b
[3][v0
] + v1
, bsz
+ 1); /* { dg-warning "unterminated" "pr86936" { xfail *-*-* } } */
123 T (&b
[i3
][i1
], bsz
); /* { dg-warning "unterminated" } */
124 T (&b
[i3
][i1
] + 1, bsz
); /* { dg-warning "unterminated" } */
125 T (&b
[i3
][i1
] + i1
, bsz
); /* { dg-warning "specified bound 5 exceeds the size 3 of unterminated array" } */
127 T (&b
[i3
][i1
] + v0
, bsz
); /* { dg-warning "specified bound 5 exceeds the size of at most 4 of unterminated array" } */
128 T (&b
[i3
][v0
] + v1
, bsz
);
130 T (&b
[i3
][i1
], bsz
+ 1); /* { dg-warning "unterminated" } */
131 T (&b
[i3
][i1
] + 1, bsz
+ 1); /* { dg-warning "unterminated" } */
132 T (&b
[i3
][i1
] + i1
, bsz
+ 1); /* { dg-warning "unterminated" } */
133 T (&b
[i3
][v0
], bsz
+ 1); /* { dg-warning "unterminated" "pr86919" { xfail *-*-* } } */
134 T (&b
[i3
][i1
] + v0
, bsz
+ 1); /* { dg-warning "unterminated" } */
135 T (&b
[i3
][v0
] + v1
, bsz
+ 1); /* { dg-warning "unterminated" "pr86919" { xfail *-*-* } } */
137 T (v0
? "" : b
[0], bsz
);
138 T (v0
? "" : b
[1], bsz
);
139 T (v0
? "" : b
[2], bsz
);
140 T (v0
? "" : b
[3], bsz
);
141 T (v0
? b
[0] : "", bsz
);
142 T (v0
? b
[1] : "", bsz
);
143 T (v0
? b
[2] : "", bsz
);
144 T (v0
? b
[3] : "", bsz
);
146 /* The warnings below are strictly correct but the strnlen calls are safe
147 because the reads are bounded by the length of the constant arguments.
148 It might make sense to relax the warning to avoid triggering for them. */
149 T (v0
? "" : b
[0], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
150 T (v0
? "" : b
[1], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
151 T (v0
? "" : b
[2], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
152 T (v0
? "" : b
[3], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
153 T (v0
? b
[0] : "", bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
154 T (v0
? b
[1] : "", bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
155 T (v0
? b
[2] : "", bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
156 T (v0
? b
[3] : "", bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
158 T (v0
? "" : b
[i0
], bsz
);
159 T (v0
? "" : b
[i1
], bsz
);
160 T (v0
? "" : b
[i2
], bsz
);
161 T (v0
? "" : b
[i3
], bsz
);
162 T (v0
? b
[i0
] : "", bsz
);
163 T (v0
? b
[i1
] : "", bsz
);
164 T (v0
? b
[i2
] : "", bsz
);
165 T (v0
? b
[i3
] : "", bsz
);
167 T (v0
? "" : b
[i0
], bsz
+ 1);
168 T (v0
? "" : b
[i1
], bsz
+ 1);
169 T (v0
? "" : b
[i2
], bsz
+ 1);
170 T (v0
? "" : b
[i3
], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" "pr86937" } */
171 T (v0
? b
[i0
] : "", bsz
+ 1);
172 T (v0
? b
[i1
] : "", bsz
+ 1);
173 T (v0
? b
[i2
] : "", bsz
+ 1);
174 T (v0
? b
[i3
] : "", bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" "pr86937" } */
176 T (v0
? "1234" : b
[3], bsz
);
177 T (v0
? "1234" : b
[i3
], bsz
);
178 T (v0
? b
[3] : "1234", bsz
);
179 T (v0
? b
[i3
] : "1234", bsz
);
181 T (v0
? a
: b
[3], bsz
);
182 T (v0
? b
[0] : b
[2], bsz
);
183 T (v0
? b
[2] : b
[3], bsz
);
184 T (v0
? b
[3] : b
[2], bsz
);
186 T (v0
? "1234" : b
[3], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
187 T (v0
? "1234" : b
[i3
], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
188 T (v0
? b
[3] : "1234", bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
189 T (v0
? b
[i3
] : "1234", bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
191 T (v0
? a
: b
[3], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
192 T (v0
? b
[0] : b
[2], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
193 T (v0
? b
[2] : b
[3], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
194 T (v0
? b
[3] : b
[2], bsz
+ 1); /* { dg-warning "bound 6 exceeds source size 5" } */
196 struct A
{ char a
[5], b
[5]; };
198 const struct A s
= { "1234", "12345" };
202 T (&s
.a
[0] + 1, asz
);
203 T (&s
.a
[0] + v0
, asz
);
205 T (&s
.a
[1] + 1, asz
);
206 T (&s
.a
[1] + v0
, asz
);
209 T (&s
.a
[i0
] + i1
, asz
);
210 T (&s
.a
[i0
] + v0
, asz
);
212 T (&s
.a
[i1
] + i1
, asz
);
213 T (&s
.a
[i1
] + v0
, asz
);
216 T (&s
.a
[0], asz
+ 1);
217 T (&s
.a
[0] + 1, asz
+ 1);
218 T (&s
.a
[0] + v0
, asz
+ 1); /* { dg-warning "specified bound 6 exceeds source size 5 " } */
219 T (&s
.a
[1], asz
+ 1);
220 T (&s
.a
[1] + 1, asz
+ 1);
221 T (&s
.a
[1] + v0
, asz
+ 1); /* { dg-bogus "specified bound 6 exceeds source size 5" "pr95794" { xfail *-*-* } } */
223 T (&s
.a
[i0
], asz
+ 1);
224 T (&s
.a
[i0
] + i1
, asz
+ 1);
225 T (&s
.a
[i0
] + v0
, asz
+ 1);
226 T (&s
.a
[i1
], asz
+ 1);
227 T (&s
.a
[i1
] + i1
, asz
+ 1);
228 T (&s
.a
[i1
] + v0
, asz
+ 1);
232 T (&s
.b
[0] + 1, bsz
); /* { dg-warning "unterminated" } */
233 T (&s
.b
[0] + v0
, bsz
); /* { dg-warning "unterminated" } */
234 T (&s
.b
[1], bsz
); /* { dg-warning "unterminated" } */
235 T (&s
.b
[1] + 1, bsz
); /* { dg-warning "unterminated" } */
236 T (&s
.b
[1] + v0
, bsz
); /* { dg-warning "unterminated" } */
239 T (&s
.b
[i0
] + i1
, bsz
); /* { dg-warning "unterminated" } */
240 T (&s
.b
[i0
] + v0
, bsz
); /* { dg-warning "unterminated" } */
241 T (&s
.b
[i1
], bsz
); /* { dg-warning "unterminated" } */
242 T (&s
.b
[i1
] + i1
, bsz
); /* { dg-warning "unterminated" } */
243 T (&s
.b
[i1
] + v0
, bsz
); /* { dg-warning "unterminated" } */
245 T (s
.b
, bsz
+ 1); /* { dg-warning "unterminated" } */
246 T (&s
.b
[0], bsz
+ 1); /* { dg-warning "unterminated" } */
247 T (&s
.b
[0] + 1, bsz
+ 1); /* { dg-warning "unterminated" } */
248 T (&s
.b
[0] + v0
, bsz
+ 1); /* { dg-warning "unterminated" } */
249 T (&s
.b
[1], bsz
+ 1); /* { dg-warning "unterminated" } */
250 T (&s
.b
[1] + 1, bsz
+ 1); /* { dg-warning "unterminated" } */
251 T (&s
.b
[1] + v0
, bsz
+ 1); /* { dg-warning "unterminated" } */
253 T (&s
.b
[i0
], bsz
+ 1); /* { dg-warning "unterminated" } */
254 T (&s
.b
[i0
] + i1
, bsz
+ 1); /* { dg-warning "unterminated" } */
255 T (&s
.b
[i0
] + v0
, bsz
+ 1); /* { dg-warning "unterminated" } */
256 T (&s
.b
[i1
], bsz
+ 1); /* { dg-warning "unterminated" } */
257 T (&s
.b
[i1
] + i1
, bsz
+ 1); /* { dg-warning "unterminated" } */
258 T (&s
.b
[i1
] + v0
, bsz
+ 1); /* { dg-warning "unterminated" } */
260 struct B
{ struct A a
[2]; };
262 const struct B ba
[] = {
263 { { { "123", "12345" }, { "12345", "123" } } },
264 { { { "12345", "123" }, { "123", "12345" } } },
265 { { { "1", "12" }, { "123", "1234" } } },
266 { { { "123", "1234" }, { "12345", "12" } } }
269 T (ba
[0].a
[0].a
, asz
+ 1);
270 T (&ba
[0].a
[0].a
[0], asz
+ 1);
271 T (&ba
[0].a
[0].a
[0] + 1, asz
+ 1);
272 T (&ba
[0].a
[0].a
[0] + v0
, asz
+ 1); /* { dg-bogus "specified bound 6 exceeds source size 5" pr95794" { xfail *-*-* } } */
273 T (&ba
[0].a
[0].a
[1], asz
+ 1);
274 T (&ba
[0].a
[0].a
[1] + 1, asz
+ 1);
275 T (&ba
[0].a
[0].a
[1] + v0
, asz
+ 1); /* { dg-bogus "specified bound 6 exceeds source size 5" pr95794" { xfail *-*-* } } */
277 T (ba
[0].a
[0].b
, bsz
);
278 T (&ba
[0].a
[0].b
[0], bsz
);
279 T (&ba
[0].a
[0].b
[0] + 1, bsz
); /* { dg-warning "unterminated" } */
280 T (&ba
[0].a
[0].b
[0] + 1, bsz
- 1);
281 T (&ba
[0].a
[0].b
[0] + v0
, bsz
); /* { dg-warning "unterminated" } */
282 T (&ba
[0].a
[0].b
[1], bsz
); /* { dg-warning "unterminated" } */
283 T (&ba
[0].a
[0].b
[1], bsz
- 1);
284 T (&ba
[0].a
[0].b
[1] + 1, bsz
- 1); /* { dg-warning "unterminated" } */
285 T (&ba
[0].a
[0].b
[1] + 1, bsz
- 2);
286 T (&ba
[0].a
[0].b
[1] + 1, bsz
); /* { dg-warning "unterminated" } */
287 T (&ba
[0].a
[0].b
[1] + v0
, bsz
); /* { dg-warning "unterminated" } */
289 T (ba
[0].a
[0].b
, bsz
+ 1); /* { dg-warning "unterminated" } */
290 T (&ba
[0].a
[0].b
[0], bsz
+ 1); /* { dg-warning "unterminated" } */
291 T (&ba
[0].a
[0].b
[0] + 1, bsz
+ 1); /* { dg-warning "unterminated" } */
292 T (&ba
[0].a
[0].b
[0] + v0
, bsz
+ 1); /* { dg-warning "unterminated" } */
293 T (&ba
[0].a
[0].b
[1], bsz
+ 1); /* { dg-warning "unterminated" } */
294 T (&ba
[0].a
[0].b
[1] + 1, bsz
+ 1); /* { dg-warning "unterminated" } */
295 T (&ba
[0].a
[0].b
[1] + v0
, bsz
+ 1); /* { dg-warning "unterminated" } */
297 T (ba
[0].a
[1].a
, asz
+ 1); /* { dg-warning "unterminated" } */
298 T (&ba
[0].a
[1].a
[0], asz
+ 1); /* { dg-warning "unterminated" } */
299 T (&ba
[0].a
[1].a
[0] + 1, asz
+ 1); /* { dg-warning "unterminated" } */
300 T (&ba
[0].a
[1].a
[0] + v0
, asz
+ 1); /* { dg-warning "unterminated" } */
301 T (&ba
[0].a
[1].a
[1], asz
+ 1); /* { dg-warning "unterminated" } */
302 T (&ba
[0].a
[1].a
[1] + 1, asz
+ 1); /* { dg-warning "unterminated" } */
303 T (&ba
[0].a
[1].a
[1] + v0
, asz
+ 1); /* { dg-warning "unterminated" } */
305 T (ba
[0].a
[1].b
, bsz
+ 1);
306 T (&ba
[0].a
[1].b
[0], bsz
+ 1);
307 T (&ba
[0].a
[1].b
[0] + 1, bsz
+ 1);
308 T (&ba
[0].a
[1].b
[0] + v0
, bsz
+ 1); /* { dg-bogus "specified bound 6 exceeds source size 5" pr95794" { xfail *-*-* } } */
309 T (&ba
[0].a
[1].b
[1], bsz
+ 1);
310 T (&ba
[0].a
[1].b
[1] + 1, bsz
+ 1);
311 T (&ba
[0].a
[1].b
[1] + v0
, bsz
+ 1); /* { dg-bogus "specified bound 6 exceeds source size 5" pr95794" { xfail *-*-* } } */
313 T (ba
[1].a
[0].a
, asz
);
314 T (&ba
[1].a
[0].a
[0], asz
);
315 T (&ba
[1].a
[0].a
[0] + 1, asz
); /* { dg-warning "unterminated" } */
316 T (&ba
[1].a
[0].a
[0] + v0
, asz
); /* { dg-warning "unterminated" } */
317 T (&ba
[1].a
[0].a
[1], asz
); /* { dg-warning "unterminated" } */
318 T (&ba
[1].a
[0].a
[1] + 1, asz
); /* { dg-warning "unterminated" } */
319 T (&ba
[1].a
[0].a
[1] + v0
, asz
); /* { dg-warning "unterminated" } */
321 T (ba
[1].a
[0].a
, asz
+ 1); /* { dg-warning "unterminated" } */
322 T (&ba
[1].a
[0].a
[0], asz
+ 1); /* { dg-warning "unterminated" } */
323 T (&ba
[1].a
[0].a
[0] + 1, asz
+ 1); /* { dg-warning "unterminated" } */
324 T (&ba
[1].a
[0].a
[0] + v0
, asz
+ 1); /* { dg-warning "unterminated" } */
325 T (&ba
[1].a
[0].a
[1], asz
+ 1); /* { dg-warning "unterminated" } */
326 T (&ba
[1].a
[0].a
[1] + 1, asz
+ 1); /* { dg-warning "unterminated" } */
327 T (&ba
[1].a
[0].a
[1] + v0
, asz
+ 1); /* { dg-warning "unterminated" } */
329 T (ba
[1].a
[0].b
, bsz
);
330 T (&ba
[1].a
[0].b
[0], bsz
);
331 T (&ba
[1].a
[0].b
[0] + 1, bsz
);
332 T (&ba
[1].a
[0].b
[0] + v0
, bsz
);
333 T (&ba
[1].a
[0].b
[1], bsz
);
334 T (&ba
[1].a
[0].b
[1] + 1, bsz
);
335 T (&ba
[1].a
[0].b
[1] + v0
, bsz
);
337 T (ba
[1].a
[1].a
, asz
);
338 T (&ba
[1].a
[1].a
[0], asz
);
339 T (&ba
[1].a
[1].a
[0] + 1, asz
);
340 T (&ba
[1].a
[1].a
[0] + v0
, asz
);
341 T (&ba
[1].a
[1].a
[1], asz
);
342 T (&ba
[1].a
[1].a
[1] + 1, asz
);
343 T (&ba
[1].a
[1].a
[1] + v0
, asz
);
345 T (ba
[1].a
[1].b
, bsz
);
346 T (&ba
[1].a
[1].b
[0], bsz
);
347 T (&ba
[1].a
[1].b
[0] + 1, bsz
); /* { dg-warning "unterminated" } */
348 T (&ba
[1].a
[1].b
[0] + 1, bsz
- 1);
349 T (&ba
[1].a
[1].b
[0] + v0
, bsz
); /* { dg-warning "unterminated" } */
350 T (&ba
[1].a
[1].b
[1], bsz
); /* { dg-warning "unterminated" } */
351 T (&ba
[1].a
[1].b
[1], bsz
- 1);
352 T (&ba
[1].a
[1].b
[1] + 1, bsz
); /* { dg-warning "unterminated" } */
353 T (&ba
[1].a
[1].b
[1] + 1, bsz
- 1); /* { dg-warning "unterminated" } */
354 T (&ba
[1].a
[1].b
[1] + 1, bsz
- 2);
355 T (&ba
[1].a
[1].b
[1] + 1, bsz
- i2
);
356 T (&ba
[1].a
[1].b
[1] + v0
, bsz
); /* { dg-warning "unterminated" } */
358 /* Prune out warnings with no location (pr?????).
359 { dg-prune-output "cc1:" } */