1 /* PR tree-optimization/86552 - missing warning for reading past the end
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" } */
16 #define CONCAT(a, b) a ## b
17 #define CAT(a, b) CONCAT(a, b)
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"
41 T (b
[3]); /* { dg-warning "nul" } */
46 T (b
[i3
]); /* { dg-warning "nul" } */
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" } */
75 T (&b
[i3
][i1
] + v0
); /* { dg-warning "nul" } */
76 T (&b
[i3
][v0
] + v1
); /* { dg-warning "nul" } */
81 T (v0
? "" : b
[3]); /* { dg-warning "nul" } */
85 T (v0
? b
[3] : ""); /* { dg-warning "nul" } */
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" } */
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" };
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" } */
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" } */
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" } } }
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" } */
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" } */
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
);
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" } */
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
);
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
);
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
);
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
);
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" } */
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" } */