131
|
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" } */
|
|
5
|
|
6 extern __SIZE_TYPE__ strlen (const char*);
|
|
7
|
|
8 const char a[5] = "12345"; /* { dg-message "declared here" } */
|
|
9
|
|
10 int v0 = 0;
|
|
11 int v1 = 1;
|
|
12 volatile int v2;
|
|
13
|
|
14 void sink (int, ...);
|
|
15
|
|
16 #define CONCAT(a, b) a ## b
|
|
17 #define CAT(a, b) CONCAT(a, b)
|
|
18
|
|
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
|
|
25
|
|
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" } */
|
|
32
|
|
33
|
|
34 const char b[][5] = { /* { dg-message "declared here" } */
|
|
35 "12", "123", "1234", "54321"
|
|
36 };
|
|
37
|
|
38 T (b[0]);
|
|
39 T (b[1]);
|
|
40 T (b[2]);
|
|
41 T (b[3]); /* { dg-warning "nul" } */
|
|
42
|
|
43 T (b[i0]);
|
|
44 T (b[i1]);
|
|
45 T (b[i2]);
|
|
46 T (b[i3]); /* { dg-warning "nul" } */
|
|
47
|
|
48 T (b[v0]);
|
|
49
|
|
50 T (&b[i2][i1]);
|
|
51 T (&b[i2][i1] + i1);
|
|
52 T (&b[i2][v0]);
|
|
53 T (&b[i2][i1] + v0);
|
|
54
|
|
55 T (&b[2][1]);
|
|
56 T (&b[2][1] + i1);
|
|
57 T (&b[2][i0]);
|
|
58 T (&b[2][1] + i0);
|
|
59
|
|
60 T (&b[2][1]);
|
|
61 T (&b[2][1] + v0);
|
|
62 T (&b[2][v0]);
|
|
63
|
|
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" } */
|
|
70
|
|
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" } */
|
|
77
|
|
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" } */
|
|
86
|
|
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" } */
|
|
97
|
|
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" } */
|
|
102
|
|
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" } */
|
|
107
|
|
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" } */
|
|
112
|
|
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" } */
|
|
116
|
|
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" } */
|
|
120
|
|
121 T (v0 ? &b[3][1] + v0 : b[2]); /* { dg-warning "nul" } */
|
|
122 T (v0 ? &b[3][v0] : &b[3][v1]); /* { dg-warning "nul" } */
|
|
123
|
|
124
|
|
125 struct A { char a[5], b[5]; };
|
|
126
|
|
127 const struct A s = { "1234", "12345" };
|
|
128
|
|
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);
|
|
136
|
|
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);
|
|
143
|
|
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" } */
|
|
152
|
|
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" } */
|
|
159
|
|
160 struct B { struct A a[2]; };
|
|
161
|
|
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" } } }
|
|
167 };
|
|
168
|
|
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);
|
|
176
|
|
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" } */
|
|
184
|
|
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" } */
|
|
192
|
|
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);
|
|
200
|
|
201
|
|
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" } */
|
|
209
|
|
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);
|
|
217
|
|
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);
|
|
225
|
|
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" } */
|
|
233
|
|
234
|
|
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);
|
|
242
|
|
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);
|
|
250
|
|
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);
|
|
258
|
|
259
|
|
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);
|
|
267
|
|
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);
|
|
275
|
|
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" } */
|
|
283
|
|
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);
|
|
291
|
|
292
|
|
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" } */
|
|
295
|
|
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" } */
|
|
298
|
|
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);
|
|
301
|
|
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" } */
|