1 /* PR tree-optimization/86552 - missing warning for reading past the end
4 { dg-options "-O2 -Wall -Wno-array-bounds -ftrack-macro-expansion=0" } */
6 extern char* stpcpy (char*, const char*);
8 const char a
[5] = "12345"; /* { dg-message "declared here" } */
15 void sink (char*, ...);
17 #define T(str) sink (stpcpy (d, str))
19 void test_one_dim_array (char *d
)
21 T (a
); /* { dg-warning "argument missing terminating nul" } */
22 T (&a
[0]); /* { dg-warning "nul" } */
23 T (&a
[0] + 1); /* { dg-warning "nul" } */
24 T (&a
[1]); /* { dg-warning "nul" } */
29 T (&a
[i0
]); /* { dg-warning "nul" } */
30 T (&a
[i0
] + 1); /* { dg-warning "nul" } */
31 T (&a
[i1
]); /* { dg-warning "nul" } */
33 T (&a
[v0
]); /* { dg-warning "nul" } */
34 T (&a
[v0
] + 1); /* { dg-warning "nul" } */
35 T (&a
[v0
] + v1
); /* { dg-warning "nul" } */
38 const char b
[][5] = { /* { dg-message "declared here" } */
39 "12", "123", "1234", "54321"
42 void test_two_dim_array (char *d
)
52 T (b
[3]); /* { dg-warning "nul" } */
56 T (b
[i3
]); /* { dg-warning "nul" } */
70 T (&b
[3][1]); /* { dg-warning "nul" } */
71 T (&b
[3][1] + 1); /* { dg-warning "nul" } */
72 T (&b
[3][v0
]); /* { dg-warning "nul" } */
73 T (&b
[3][1] + v0
); /* { dg-warning "nul" } */
74 T (&b
[3][v0
] + v1
); /* { dg-warning "nul" } */
76 T (&b
[i3
][i1
]); /* { dg-warning "nul" } */
77 T (&b
[i3
][i1
] + i1
); /* { dg-warning "nul" } */
78 T (&b
[i3
][v0
]); /* { dg-warning "nul" } */
79 T (&b
[i3
][i1
] + v0
); /* { dg-warning "nul" } */
80 T (&b
[i3
][v0
] + v1
); /* { dg-warning "nul" } */
85 T (v0
? "" : b
[3]); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
89 T (v0
? b
[3] : ""); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
91 T (v0
? "1234" : b
[3]); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
92 T (v0
? b
[3] : "1234"); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
94 T (v0
? a
: b
[3]); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
96 T (v0
? b
[2] : b
[3]); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
97 T (v0
? b
[3] : b
[2]); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
99 T (v0
? b
[0] : &b
[3][0] + 1); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
100 T (v0
? b
[1] : &b
[3][1] + v0
); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
102 /* It's possible to detect the missing nul in the following two
103 expressions but GCC doesn't do it yet. */
104 T (v0
? &b
[3][1] + v0
: b
[2]); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
105 T (v0
? &b
[3][v0
] : &b
[3][v1
]); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
108 struct A
{ char a
[5], b
[5]; };
110 const struct A s
= { "1234", "12345" };
112 void test_struct_member (char *d
)
154 T (s
.b
); /* { dg-warning "nul" } */
155 T (&s
.b
[0]); /* { dg-warning "nul" } */
156 T (&s
.b
[0] + 1); /* { dg-warning "nul" } */
157 T (&s
.b
[0] + i0
); /* { dg-warning "nul" } */
158 T (&s
.b
[1]); /* { dg-warning "nul" } */
159 T (&s
.b
[1] + 1); /* { dg-warning "nul" } */
160 T (&s
.b
[1] + i0
); /* { dg-warning "nul" } */
162 T (s
.b
); /* { dg-warning "nul" } */
163 T (&s
.b
[0]); /* { dg-warning "nul" } */
164 T (&s
.b
[0] + 1); /* { dg-warning "nul" } */
165 T (&s
.b
[0] + v0
); /* { dg-warning "nul" } */
166 T (&s
.b
[1]); /* { dg-warning "nul" } */
167 T (&s
.b
[1] + 1); /* { dg-warning "nul" } */
168 T (&s
.b
[1] + v0
); /* { dg-warning "nul" } */
170 T (s
.b
); /* { dg-warning "nul" } */
171 T (&s
.b
[v0
]); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
172 T (&s
.b
[v0
] + 1); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
173 T (&s
.b
[v0
] + v0
); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
174 T (&s
.b
[v1
]); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
175 T (&s
.b
[v1
] + 1); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
176 T (&s
.b
[v1
] + v0
); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
179 struct B
{ struct A a
[2]; };
181 const struct B ba
[] = {
182 { { { "123", "12345" }, { "12345", "123" } } },
183 { { { "12345", "123" }, { "123", "12345" } } },
184 { { { "1", "12" }, { "123", "1234" } } },
185 { { { "123", "1234" }, { "12345", "12" } } }
188 void test_array_of_structs (char *d
)
191 T (&ba
[0].a
[0].a
[0]);
192 T (&ba
[0].a
[0].a
[0] + 1);
193 T (&ba
[0].a
[0].a
[0] + v0
);
194 T (&ba
[0].a
[0].a
[1]);
195 T (&ba
[0].a
[0].a
[1] + 1);
196 T (&ba
[0].a
[0].a
[1] + v0
);
198 T (ba
[0].a
[0].b
); /* { dg-warning "nul" } */
199 T (&ba
[0].a
[0].b
[0]); /* { dg-warning "nul" } */
200 T (&ba
[0].a
[0].b
[0] + 1); /* { dg-warning "nul" } */
201 T (&ba
[0].a
[0].b
[0] + v0
); /* { dg-warning "nul" } */
202 T (&ba
[0].a
[0].b
[1]); /* { dg-warning "nul" } */
203 T (&ba
[0].a
[0].b
[1] + 1); /* { dg-warning "nul" } */
204 T (&ba
[0].a
[0].b
[1] + v0
); /* { dg-warning "nul" } */
206 T (ba
[0].a
[1].a
); /* { dg-warning "nul" } */
207 T (&ba
[0].a
[1].a
[0]); /* { dg-warning "nul" } */
208 T (&ba
[0].a
[1].a
[0] + 1); /* { dg-warning "nul" } */
209 T (&ba
[0].a
[1].a
[0] + v0
); /* { dg-warning "nul" } */
210 T (&ba
[0].a
[1].a
[1]); /* { dg-warning "nul" } */
211 T (&ba
[0].a
[1].a
[1] + 1); /* { dg-warning "nul" } */
212 T (&ba
[0].a
[1].a
[1] + v0
); /* { dg-warning "nul" } */
215 T (&ba
[0].a
[1].b
[0]);
216 T (&ba
[0].a
[1].b
[0] + 1);
217 T (&ba
[0].a
[1].b
[0] + v0
);
218 T (&ba
[0].a
[1].b
[1]);
219 T (&ba
[0].a
[1].b
[1] + 1);
220 T (&ba
[0].a
[1].b
[1] + v0
);
223 T (ba
[1].a
[0].a
); /* { dg-warning "nul" } */
224 T (&ba
[1].a
[0].a
[0]); /* { dg-warning "nul" } */
225 T (&ba
[1].a
[0].a
[0] + 1); /* { dg-warning "nul" } */
226 T (&ba
[1].a
[0].a
[0] + v0
); /* { dg-warning "nul" } */
227 T (&ba
[1].a
[0].a
[1]); /* { dg-warning "nul" } */
228 T (&ba
[1].a
[0].a
[1] + 1); /* { dg-warning "nul" } */
229 T (&ba
[1].a
[0].a
[1] + v0
); /* { dg-warning "nul" } */
232 T (&ba
[1].a
[0].b
[0]);
233 T (&ba
[1].a
[0].b
[0] + 1);
234 T (&ba
[1].a
[0].b
[0] + v0
);
235 T (&ba
[1].a
[0].b
[1]);
236 T (&ba
[1].a
[0].b
[1] + 1);
237 T (&ba
[1].a
[0].b
[1] + v0
);
240 T (&ba
[1].a
[1].a
[0]);
241 T (&ba
[1].a
[1].a
[0] + 1);
242 T (&ba
[1].a
[1].a
[0] + v0
);
243 T (&ba
[1].a
[1].a
[1]);
244 T (&ba
[1].a
[1].a
[1] + 1);
245 T (&ba
[1].a
[1].a
[1] + v0
);
247 T (ba
[1].a
[1].b
); /* { dg-warning "nul" } */
248 T (&ba
[1].a
[1].b
[0]); /* { dg-warning "nul" } */
249 T (&ba
[1].a
[1].b
[0] + 1); /* { dg-warning "nul" } */
250 T (&ba
[1].a
[1].b
[0] + v0
); /* { dg-warning "nul" } */
251 T (&ba
[1].a
[1].b
[1]); /* { dg-warning "nul" } */
252 T (&ba
[1].a
[1].b
[1] + 1); /* { dg-warning "nul" } */
253 T (&ba
[1].a
[1].b
[1] + v0
); /* { dg-warning "nul" } */
257 T (&ba
[2].a
[0].a
[0]);
258 T (&ba
[2].a
[0].a
[0] + 1);
259 T (&ba
[2].a
[0].a
[0] + v0
);
260 T (&ba
[2].a
[0].a
[1]);
261 T (&ba
[2].a
[0].a
[1] + 1);
262 T (&ba
[2].a
[0].a
[1] + v0
);
265 T (&ba
[2].a
[0].b
[0]);
266 T (&ba
[2].a
[0].b
[0] + 1);
267 T (&ba
[2].a
[0].b
[0] + v0
);
268 T (&ba
[2].a
[0].b
[1]);
269 T (&ba
[2].a
[0].b
[1] + 1);
270 T (&ba
[2].a
[0].b
[1] + v0
);
273 T (&ba
[2].a
[1].a
[0]);
274 T (&ba
[2].a
[1].a
[0] + 1);
275 T (&ba
[2].a
[1].a
[0] + v0
);
276 T (&ba
[2].a
[1].a
[1]);
277 T (&ba
[2].a
[1].a
[1] + 1);
278 T (&ba
[2].a
[1].a
[1] + v0
);
282 T (&ba
[3].a
[0].a
[0]);
283 T (&ba
[3].a
[0].a
[0] + 1);
284 T (&ba
[3].a
[0].a
[0] + v0
);
285 T (&ba
[3].a
[0].a
[1]);
286 T (&ba
[3].a
[0].a
[1] + 1);
287 T (&ba
[3].a
[0].a
[1] + v0
);
290 T (&ba
[3].a
[0].b
[0]);
291 T (&ba
[3].a
[0].b
[0] + 1);
292 T (&ba
[3].a
[0].b
[0] + v0
);
293 T (&ba
[3].a
[0].b
[1]);
294 T (&ba
[3].a
[0].b
[1] + 1);
295 T (&ba
[3].a
[0].b
[1] + v0
);
297 T (ba
[3].a
[1].a
); /* { dg-warning "nul" } */
298 T (&ba
[3].a
[1].a
[0]); /* { dg-warning "nul" } */
299 T (&ba
[3].a
[1].a
[0] + 1); /* { dg-warning "nul" } */
300 T (&ba
[3].a
[1].a
[0] + v0
); /* { dg-warning "nul" } */
301 T (&ba
[3].a
[1].a
[1]); /* { dg-warning "nul" } */
302 T (&ba
[3].a
[1].a
[1] + 1); /* { dg-warning "nul" } */
303 T (&ba
[3].a
[1].a
[1] + v0
); /* { dg-warning "nul" } */
306 T (&ba
[3].a
[1].b
[0]);
307 T (&ba
[3].a
[1].b
[0] + 1);
308 T (&ba
[3].a
[1].b
[0] + v0
);
309 T (&ba
[3].a
[1].b
[1]);
310 T (&ba
[3].a
[1].b
[1] + 1);
311 T (&ba
[3].a
[1].b
[1] + v0
);
314 T (v0
? ba
[0].a
[0].a
: ba
[0].a
[0].b
); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
315 T (v0
? ba
[0].a
[0].a
: ba
[0].a
[0].b
); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
317 T (v0
? &ba
[0].a
[0].a
[0] : &ba
[3].a
[1].a
[0]); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
318 T (v0
? &ba
[3].a
[1].a
[1] : ba
[0].a
[0].a
); /* { dg-warning "nul" "bug ???" { xfail *-*-* } } */
320 T (v0
? ba
[0].a
[0].a
: ba
[0].a
[1].b
);
321 T (v0
? ba
[0].a
[1].b
: ba
[0].a
[0].a
);
324 /* { dg-prune-output " reading \[1-9\]\[0-9\]? bytes from a region " } */