]>
git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.dg/Wstringop-overflow-88.c
1 /* PR middle-end/101475 - missing -Wstringop-overflow storing a compound
4 { dg-options "-O2 -fno-tree-vectorize" } */
6 extern char ea1
[1], ea2
[2], ea3
[3], ea4
[4];
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]; };
23 struct Sx
*p
= (struct Sx
*)ea1
;
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" }
33 struct S0
*p
= (struct S0
*)ea1
;
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" }
43 struct S1
*p
= (struct S1
*)ea1
;
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" }
53 struct S2
*p
= (struct S2
*)ea1
;
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" }
63 struct S3
*p
= (struct S3
*)ea1
;
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" }
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" }
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" }
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" }
102 void f2_ea1_p1 (void)
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" }
112 void f3_ea1_p1 (void)
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" }
125 struct Sx
*p
= (struct Sx
*)ea2
;
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" }
135 struct S0
*p
= (struct S0
*)ea2
;
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" }
145 struct S1
*p
= (struct S1
*)ea2
;
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" }
155 struct S2
*p
= (struct S2
*)ea2
;
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" }
165 struct S3
*p
= (struct S3
*)ea2
;
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" }
174 void fx_ea2_p1 (void)
176 struct Sx
*p
= (struct Sx
*)(ea2
+ 1);
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" }
184 void f0_ea2_p1 (void)
186 struct S0
*p
= (struct S0
*)(ea2
+ 1);
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" }
194 void f1_ea2_p1 (void)
196 struct S1
*p
= (struct S1
*)(ea2
+ 1);
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" }
204 void f2_ea2_p1 (void)
206 struct S2
*p
= (struct S2
*)(ea2
+ 1);
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" }
214 void f3_ea2_p1 (void)
216 struct S3
*p
= (struct S3
*)(ea2
+ 1);
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" }
227 struct Sx
*p
= (struct Sx
*)ea3
;
231 p
->a
[2] = 2; // { dg-warning "-Wstringop-overflow" }
232 p
->a
[3] = 3; // { dg-warning "-Wstringop-overflow" }
237 struct S0
*p
= (struct S0
*)ea3
;
241 p
->a
[2] = 2; // { dg-warning "-Wstringop-overflow" }
242 p
->a
[3] = 3; // { dg-warning "-Wstringop-overflow" }
247 struct S1
*p
= (struct S1
*)ea3
;
251 p
->a
[2] = 2; // { dg-warning "-Wstringop-overflow" }
252 p
->a
[3] = 3; // { dg-warning "-Wstringop-overflow" }
257 struct S2
*p
= (struct S2
*)ea3
;
261 p
->a
[2] = 2; // { dg-warning "-Wstringop-overflow" }
262 p
->a
[3] = 3; // { dg-warning "-Wstringop-overflow" }
267 struct S3
*p
= (struct S3
*)ea3
;
271 p
->a
[2] = 2; // { dg-warning "-Wstringop-overflow" }
272 p
->a
[3] = 3; // { dg-warning "-Wstringop-overflow" }
278 struct Sx
*p
= (struct Sx
*)ea4
;
283 p
->a
[3] = 3; // { dg-warning "-Wstringop-overflow" }
288 struct S0
*p
= (struct S0
*)ea4
;
293 p
->a
[3] = 3; // { dg-warning "-Wstringop-overflow" }
298 struct S1
*p
= (struct S1
*)ea4
;
303 p
->a
[3] = 3; // { dg-warning "-Wstringop-overflow" }
308 struct S2
*p
= (struct S2
*)ea4
;
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" }
321 struct S3
*p
= (struct S3
*)ea4
;
326 p
->a
[3] = 3; // { dg-warning "-Wstringop-overflow" }