]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.dg/Wstringop-overflow-88.c
Use enclosing object size if it's smaller than member [PR 101475].
[thirdparty/gcc.git] / gcc / testsuite / gcc.dg / Wstringop-overflow-88.c
1 /* PR middle-end/101475 - missing -Wstringop-overflow storing a compound
2 literal
3 { dg-do compile }
4 { dg-options "-O2 -fno-tree-vectorize" } */
5
6 extern char ea1[1], ea2[2], ea3[3], ea4[4];
7
8 /* The trailing A member of all of Sx, S0, and S1 is treated the same:
9 as a flexible array member. */
10 struct Sx { char n, a[]; };
11 struct S0 { char n, a[0]; };
12 struct S1 { char n, a[1]; };
13 /* The trailing A member in both S2 and S3 is treated as an ordinary
14 array with exactly two elements and accesses to elements beyond
15 the last are diagnosed regardless of whether they are within
16 the bounds the enclosing object. */
17 struct S2 { char n, a[2]; };
18 struct S3 { char n, a[3]; };
19
20
21 void fx_ea1 (void)
22 {
23 struct Sx *p = (struct Sx*)ea1;
24 p->n = 0;
25 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
26 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
27 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
28 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
29 }
30
31 void f0_ea1 (void)
32 {
33 struct S0 *p = (struct S0*)ea1;
34 p->n = 0;
35 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
36 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
37 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
38 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
39 }
40
41 void f1_ea1 (void)
42 {
43 struct S1 *p = (struct S1*)ea1;
44 p->n = 0;
45 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
46 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
47 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
48 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
49 }
50
51 void f2_ea1 (void)
52 {
53 struct S2 *p = (struct S2*)ea1;
54 p->n = 0;
55 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
56 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
57 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
58 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
59 }
60
61 void f3_ea1 (void)
62 {
63 struct S3 *p = (struct S3*)ea1;
64 p->n = 0;
65 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
66 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
67 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
68 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
69 }
70
71
72 void fx_ea1_p1 (void)
73 {
74 struct Sx *p = (struct Sx*)(ea1 + 1);
75 p->n = 0; // { dg-warning "-Wstringop-overflow" }
76 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
77 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
78 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
79 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
80 }
81
82 void f0_ea1_p1 (void)
83 {
84 struct S0 *p = (struct S0*)(ea1 + 1);
85 p->n = 0; // { dg-warning "-Wstringop-overflow" }
86 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
87 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
88 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
89 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
90 }
91
92 void f1_ea1_p1 (void)
93 {
94 struct S1 *p = (struct S1*)(ea1 + 1);
95 p->n = 0; // { dg-warning "-Wstringop-overflow" }
96 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
97 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
98 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
99 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
100 }
101
102 void f2_ea1_p1 (void)
103 {
104 struct S2 *p = (struct S2*)(ea1 + 1);
105 p->n = 0; // { dg-warning "-Wstringop-overflow" }
106 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
107 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
108 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
109 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
110 }
111
112 void f3_ea1_p1 (void)
113 {
114 struct S3 *p = (struct S3*)(ea1 + 1);
115 p->n = 0; // { dg-warning "-Wstringop-overflow" }
116 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
117 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
118 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
119 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
120 }
121
122
123 void fx_ea2 (void)
124 {
125 struct Sx *p = (struct Sx*)ea2;
126 p->n = 0;
127 p->a[0] = 0;
128 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
129 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
130 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
131 }
132
133 void f0_ea2 (void)
134 {
135 struct S0 *p = (struct S0*)ea2;
136 p->n = 0;
137 p->a[0] = 0;
138 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
139 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
140 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
141 }
142
143 void f1_ea2 (void)
144 {
145 struct S1 *p = (struct S1*)ea2;
146 p->n = 0;
147 p->a[0] = 0;
148 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
149 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
150 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
151 }
152
153 void f2_ea2 (void)
154 {
155 struct S2 *p = (struct S2*)ea2;
156 p->n = 0;
157 p->a[0] = 0;
158 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
159 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
160 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
161 }
162
163 void f3_ea2 (void)
164 {
165 struct S3 *p = (struct S3*)ea2;
166 p->n = 0;
167 p->a[0] = 0;
168 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
169 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
170 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
171 }
172
173
174 void fx_ea2_p1 (void)
175 {
176 struct Sx *p = (struct Sx*)(ea2 + 1);
177 p->n = 0;
178 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
179 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
180 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
181 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
182 }
183
184 void f0_ea2_p1 (void)
185 {
186 struct S0 *p = (struct S0*)(ea2 + 1);
187 p->n = 0;
188 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
189 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
190 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
191 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
192 }
193
194 void f1_ea2_p1 (void)
195 {
196 struct S1 *p = (struct S1*)(ea2 + 1);
197 p->n = 0;
198 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
199 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
200 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
201 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
202 }
203
204 void f2_ea2_p1 (void)
205 {
206 struct S2 *p = (struct S2*)(ea2 + 1);
207 p->n = 0;
208 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
209 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
210 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
211 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
212 }
213
214 void f3_ea2_p1 (void)
215 {
216 struct S3 *p = (struct S3*)(ea2 + 1);
217 p->n = 0;
218 p->a[0] = 0; // { dg-warning "-Wstringop-overflow" }
219 p->a[1] = 1; // { dg-warning "-Wstringop-overflow" }
220 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
221 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
222 }
223
224
225 void fx_ea3 (void)
226 {
227 struct Sx *p = (struct Sx*)ea3;
228 p->n = 0;
229 p->a[0] = 0;
230 p->a[1] = 1;
231 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
232 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
233 }
234
235 void f0_ea3 (void)
236 {
237 struct S0 *p = (struct S0*)ea3;
238 p->n = 0;
239 p->a[0] = 0;
240 p->a[1] = 1;
241 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
242 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
243 }
244
245 void f1_ea3 (void)
246 {
247 struct S1 *p = (struct S1*)ea3;
248 p->n = 0;
249 p->a[0] = 0;
250 p->a[1] = 1;
251 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
252 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
253 }
254
255 void f2_ea3 (void)
256 {
257 struct S2 *p = (struct S2*)ea3;
258 p->n = 0;
259 p->a[0] = 0;
260 p->a[1] = 1;
261 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
262 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
263 }
264
265 void f3_ea3 (void)
266 {
267 struct S3 *p = (struct S3*)ea3;
268 p->n = 0;
269 p->a[0] = 0;
270 p->a[1] = 1;
271 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
272 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
273 }
274
275
276 void fx_ea4 (void)
277 {
278 struct Sx *p = (struct Sx*)ea4;
279 p->n = 0;
280 p->a[0] = 0;
281 p->a[1] = 1;
282 p->a[2] = 2;
283 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
284 }
285
286 void f0_ea4 (void)
287 {
288 struct S0 *p = (struct S0*)ea4;
289 p->n = 0;
290 p->a[0] = 0;
291 p->a[1] = 1;
292 p->a[2] = 2;
293 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
294 }
295
296 void f1_ea4 (void)
297 {
298 struct S1 *p = (struct S1*)ea4;
299 p->n = 0;
300 p->a[0] = 0;
301 p->a[1] = 1;
302 p->a[2] = 2;
303 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
304 }
305
306 void f2_ea4 (void)
307 {
308 struct S2 *p = (struct S2*)ea4;
309 p->n = 0;
310 p->a[0] = 0;
311 p->a[1] = 1;
312 /* Even though the offset of p->a[2] is within the bounds of EA4
313 the warning triggers because it only considers trailing arrays
314 of at mnost one element as "poor man's flexible arrays." */
315 p->a[2] = 2; // { dg-warning "-Wstringop-overflow" }
316 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
317 }
318
319 void f3_ea4 (void)
320 {
321 struct S3 *p = (struct S3*)ea4;
322 p->n = 0;
323 p->a[0] = 0;
324 p->a[1] = 1;
325 p->a[2] = 2;
326 p->a[3] = 3; // { dg-warning "-Wstringop-overflow" }
327 }