]>
git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.dg/Wstringop-overflow-77.c
1 /* PR middle-end/102453 - buffer overflow by atomic built-ins not diagnosed
2 Verify that out-of-bounds accesses by atomic functions are diagnosed with
5 { dg-options "-O0 -Wall -ftrack-macro-expansion=0" } */
11 #define add_fetch(p, q) __atomic_add_fetch (p, q, 0)
12 #define sub_fetch(p, q) __atomic_sub_fetch (p, q, 0)
13 #define and_fetch(p, q) __atomic_and_fetch (p, q, 0)
14 #define or_fetch(p, q) __atomic_or_fetch (p, q, 0)
15 #define xor_fetch(p, q) __atomic_xor_fetch (p, q, 0)
16 #define nand_fetch(p, q) __atomic_nand_fetch (p, q, 0)
17 #define exchange(p, q, r) __atomic_exchange (p, q, r, 0)
18 #define exchange_n(p, n) __atomic_exchange_n (p, n, 0)
19 #define cmpxchg(p, q, r) __atomic_compare_exchange (p, q, r, 0, 0, 0)
21 typedef __SIZE_TYPE__
size_t;
23 void sink (void*, ...);
24 #define sink(...) sink (0, __VA_ARGS__)
31 extern long long int elli
;
33 extern const _Bool ecb
;
34 extern const char ecc
;
35 extern const short int ecsi
;
37 extern const long int ecli
;
38 extern const long long int eclli
;
40 extern _Atomic _Bool eab
;
41 extern _Atomic
char eac
;
42 extern _Atomic
short int easi
;
43 extern _Atomic
int eai
;
44 extern _Atomic
long int eali
;
45 extern _Atomic
long long int ealli
;
47 extern _Atomic
const _Bool eacb
;
48 extern _Atomic
const char eacc
;
49 extern _Atomic
const short int eacsi
;
50 extern _Atomic
const int eaci
;
51 extern _Atomic
const long int eacli
;
52 extern _Atomic
const long long int eaclli
;
55 void nowarn_atomic_add_fetch (void)
57 add_fetch (&eac
, ecc
);
58 add_fetch (&easi
, esi
);
60 add_fetch (&eali
, eli
);
61 add_fetch (&ealli
, elli
);
65 void warn_atomic_add_fetch (void)
67 _Atomic
char *pc
= &eac
+ 1;
68 add_fetch (pc
, ecc
); // { dg-warning "-Wstringop-overflow" }
70 _Atomic
short *psi
= (_Atomic
short*)((char*)&easi
+ 1);
71 add_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
72 psi
= (_Atomic
short*)((char*)&easi
+ 2);
73 add_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
75 _Atomic
int *pi
= (_Atomic
int*)((char*)&eai
+ 1);
76 add_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
77 pi
= (_Atomic
int*)((char*)&eai
+ 2);
78 add_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
79 pi
= (_Atomic
int*)((char*)&eai
+ sizeof eai
);
80 add_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
82 _Atomic
long *pli
= (_Atomic
long*)((char*)&eali
+ 1);
83 add_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
84 pli
= (_Atomic
long*)((char*)&eali
+ 1);
85 add_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
87 add_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
89 _Atomic
long long *plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
90 add_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
91 plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
92 add_fetch (plli
, eali
); // { dg-warning "-Wstringop-overflow" }
94 add_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
98 void nowarn_atomic_sub_fetch (void)
100 _Atomic
char *pc
= &eac
;
103 _Atomic
short *psi
= &easi
;
104 sub_fetch (psi
, esi
);
106 _Atomic
int *pi
= &eai
;
109 _Atomic
long *pli
= &eali
;
110 sub_fetch (pli
, eli
);
112 _Atomic
long long *plli
= &ealli
;
113 sub_fetch (plli
, elli
);
117 void warn_atomic_sub_fetch (void)
119 _Atomic
char *pc
= &eac
+ 1;
120 sub_fetch (pc
, ecc
); // { dg-warning "-Wstringop-overflow" }
122 _Atomic
short *psi
= (_Atomic
short*)((char*)&easi
+ 1);
123 sub_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
124 psi
= (_Atomic
short*)((char*)&easi
+ 2);
125 sub_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
127 _Atomic
int *pi
= (_Atomic
int*)((char*)&eai
+ 1);
128 sub_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
129 pi
= (_Atomic
int*)((char*)&eai
+ 2);
130 sub_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
131 pi
= (_Atomic
int*)((char*)&eai
+ sizeof eai
);
132 sub_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
134 _Atomic
long *pli
= (_Atomic
long*)((char*)&eali
+ 1);
135 sub_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
136 pli
= (_Atomic
long*)((char*)&eali
+ 1);
137 sub_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
139 sub_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
141 _Atomic
long long *plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
142 sub_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
143 plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
144 sub_fetch (plli
, eali
); // { dg-warning "-Wstringop-overflow" }
146 sub_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
150 void nowarn_atomic_and_fetch (void)
152 _Atomic
char *pc
= &eac
;
155 _Atomic
short *psi
= &easi
;
156 and_fetch (psi
, esi
);
158 _Atomic
int *pi
= &eai
;
161 _Atomic
long *pli
= &eali
;
162 and_fetch (pli
, eli
);
164 _Atomic
long long *plli
= &ealli
;
165 and_fetch (plli
, elli
);
169 void warn_atomic_and_fetch (void)
171 _Atomic
char *pc
= &eac
+ 1;
172 and_fetch (pc
, ecc
); // { dg-warning "-Wstringop-overflow" }
174 _Atomic
short *psi
= (_Atomic
short*)((char*)&easi
+ 1);
175 and_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
176 psi
= (_Atomic
short*)((char*)&easi
+ 2);
177 and_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
179 _Atomic
int *pi
= (_Atomic
int*)((char*)&eai
+ 1);
180 and_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
181 pi
= (_Atomic
int*)((char*)&eai
+ 2);
182 and_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
183 pi
= (_Atomic
int*)((char*)&eai
+ sizeof eai
);
184 and_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
186 _Atomic
long *pli
= (_Atomic
long*)((char*)&eali
+ 1);
187 and_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
188 pli
= (_Atomic
long*)((char*)&eali
+ 1);
189 and_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
191 and_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
193 _Atomic
long long *plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
194 and_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
195 plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
196 and_fetch (plli
, eali
); // { dg-warning "-Wstringop-overflow" }
198 and_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
202 void nowarn_atomic_or_fetch (void)
204 _Atomic
char *pc
= &eac
;
207 _Atomic
short *psi
= &easi
;
210 _Atomic
int *pi
= &eai
;
213 _Atomic
long *pli
= &eali
;
216 _Atomic
long long *plli
= &ealli
;
217 or_fetch (plli
, elli
);
221 void warn_atomic_or_fetch (void)
223 _Atomic
char *pc
= &eac
+ 1;
224 or_fetch (pc
, ecc
); // { dg-warning "-Wstringop-overflow" }
226 _Atomic
short *psi
= (_Atomic
short*)((char*)&easi
+ 1);
227 or_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
228 psi
= (_Atomic
short*)((char*)&easi
+ 2);
229 or_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
231 _Atomic
int *pi
= (_Atomic
int*)((char*)&eai
+ 1);
232 or_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
233 pi
= (_Atomic
int*)((char*)&eai
+ 2);
234 or_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
235 pi
= (_Atomic
int*)((char*)&eai
+ sizeof eai
);
236 or_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
238 _Atomic
long *pli
= (_Atomic
long*)((char*)&eali
+ 1);
239 or_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
240 pli
= (_Atomic
long*)((char*)&eali
+ 1);
241 or_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
243 or_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
245 _Atomic
long long *plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
246 or_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
247 plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
248 or_fetch (plli
, eali
); // { dg-warning "-Wstringop-overflow" }
250 or_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
254 void nowarn_atomic_xor_fetch (void)
256 _Atomic
char *pc
= &eac
;
259 _Atomic
short *psi
= &easi
;
260 xor_fetch (psi
, esi
);
262 _Atomic
int *pi
= &eai
;
265 _Atomic
long *pli
= &eali
;
266 xor_fetch (pli
, eli
);
268 _Atomic
long long *plli
= &ealli
;
269 xor_fetch (plli
, elli
);
273 void warn_atomic_xor_fetch (void)
275 _Atomic
char *pc
= &eac
+ 1;
276 xor_fetch (pc
, ecc
); // { dg-warning "-Wstringop-overflow" }
278 _Atomic
short *psi
= (_Atomic
short*)((char*)&easi
+ 1);
279 xor_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
280 psi
= (_Atomic
short*)((char*)&easi
+ 1);
281 xor_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
283 _Atomic
int *pi
= (_Atomic
int*)((char*)&eai
+ 1);
284 xor_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
285 pi
= (_Atomic
int*)((char*)&eai
+ 2);
286 xor_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
287 pi
= (_Atomic
int*)((char*)&eai
+ sizeof eai
);
288 xor_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
290 _Atomic
long *pli
= (_Atomic
long*)((char*)&eali
+ 1);
291 xor_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
292 pli
= (_Atomic
long*)((char*)&eali
+ 1);
293 xor_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
295 xor_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
297 _Atomic
long long *plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
298 xor_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
299 plli
= (_Atomic
long long*)((char*)&eali
+ 1);
300 xor_fetch (plli
, eali
); // { dg-warning "-Wstringop-overflow" }
302 xor_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
306 void nowarn_atomic_nand_fetch (void)
308 _Atomic
char *pc
= &eac
;
309 nand_fetch (pc
, ecc
);
311 _Atomic
short *psi
= &easi
;
312 nand_fetch (psi
, esi
);
314 _Atomic
int *pi
= &eai
;
317 _Atomic
long *pli
= &eali
;
318 nand_fetch (pli
, eli
);
320 _Atomic
long long *plli
= &ealli
;
321 nand_fetch (plli
, elli
);
325 void warn_atomic_nand_fetch (void)
327 _Atomic
char *pc
= &eac
+ 1;
328 nand_fetch (pc
, ecc
); // { dg-warning "-Wstringop-overflow" }
330 _Atomic
short *psi
= (_Atomic
short*)((char*)&easi
+ 1);
331 nand_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
332 psi
= (_Atomic
short*)((char*)&easi
+ 1);
333 nand_fetch (psi
, esi
); // { dg-warning "-Wstringop-overflow" }
335 _Atomic
int *pi
= (_Atomic
int*)((char*)&eai
+ 1);
336 nand_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
337 pi
= (_Atomic
int*)((char*)&eai
+ 2);
338 nand_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
339 pi
= (_Atomic
int*)((char*)&eai
+ sizeof eai
);
340 nand_fetch (pi
, ei
); // { dg-warning "-Wstringop-overflow" }
342 _Atomic
long *pli
= (_Atomic
long*)((char*)&eali
+ 1);
343 nand_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
344 pli
= (_Atomic
long*)((char*)&eali
+ 1);
345 nand_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
347 nand_fetch (pli
, eli
); // { dg-warning "-Wstringop-overflow" }
349 _Atomic
long long *plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
350 nand_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
351 plli
= (_Atomic
long long*)((char*)&eai
+ 1);
352 nand_fetch (plli
, eali
); // { dg-warning "-Wstringop-overflow" }
354 nand_fetch (plli
, elli
); // { dg-warning "-Wstringop-overflow" }
358 void nowarn_atomic_exchange (void)
361 _Atomic
char *pc
= &eac
;
362 exchange (pc
, &ecc
, &rc
);
365 _Atomic
short *psi
= &easi
;
366 exchange (psi
, &esi
, &rsi
);
369 _Atomic
int *pi
= &eai
;
370 exchange (pi
, &ei
, &ri
);
373 _Atomic
long *pli
= &eali
;
374 exchange (pli
, &eli
, &rli
);
377 _Atomic
long long *plli
= &ealli
;
378 exchange (plli
, &elli
, &rlli
);
380 sink (&rc
, &rsi
, &ri
, &rli
, &rlli
);
383 void warn_atomic_exchange (void)
386 _Atomic
char *pc
= &eac
+ 1;
387 exchange (pc
, &ecc
, &rc
); // { dg-warning "-Wstringop-overflow" }
390 _Atomic
short *psi
= (_Atomic
short*)((char*)&easi
+ 1);
391 exchange (psi
, &ecsi
, rsi
); // { dg-warning "-Wstringop-overflow" }
392 psi
= (_Atomic
short*)((char*)&easi
+ 2);
393 exchange (psi
, &ecsi
, rsi
+ 1); // { dg-warning "-Wstringop-overflow" }
396 _Atomic
int *pi
= (_Atomic
int*)((char*)&eai
+ 1);
397 exchange (pi
, &eci
, ri
); // { dg-warning "-Wstringop-overflow" }
398 pi
= (_Atomic
int*)((char*)&eai
+ 2);
399 exchange (pi
, &eci
, ri
+ 1); // { dg-warning "-Wstringop-overflow" }
400 pi
= (_Atomic
int*)((char*)&eai
+ sizeof eai
);
401 exchange (pi
, &eci
, ri
+ 2); // { dg-warning "-Wstringop-overflow" }
404 _Atomic
long *pli
= (_Atomic
long*)((char*)&eali
+ 1);
405 exchange (pli
, &ecli
, rli
); // { dg-warning "-Wstringop-overflow" }
406 pli
= (_Atomic
long*)((char*)&eali
+ 1);
407 exchange (pli
, &ecli
, rli
+ 1); // { dg-warning "-Wstringop-overflow" }
409 exchange (pli
, &ecli
, rli
+ 2); // { dg-warning "-Wstringop-overflow" }
412 _Atomic
long long *plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
413 exchange (plli
, &eclli
, rlli
); // { dg-warning "-Wstringop-overflow" }
414 plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
415 exchange (plli
, &eclli
, rlli
+ 1); // { dg-warning "-Wstringop-overflow" }
417 exchange (plli
, &eclli
, rlli
+ 2); // { dg-warning "-Wstringop-overflow" }
419 sink (&rc
, rsi
, ri
, rli
, rlli
);
423 void nowarn_atomic_exchange_n (_Atomic
unsigned char *pauc
,
424 _Atomic
unsigned short *pausi
,
425 _Atomic
unsigned int *paui
,
426 _Atomic
unsigned long *pauli
,
427 _Atomic
unsigned long long *paulli
)
429 char rc
= exchange_n (&eac
, ecc
);
430 short rsi
= exchange_n (&easi
, esi
);
431 int ri
= exchange_n (&eai
, ei
);
432 long rli
= exchange_n (&eali
, eli
);
433 long long rlli
= exchange_n (&ealli
, elli
);
435 sink (rc
, rsi
, ri
, rli
, rlli
);
437 char ruc
= exchange_n (pauc
, ecc
);
438 short rusi
= exchange_n (pausi
, esi
);
439 int rui
= exchange_n (paui
, ei
);
440 long ruli
= exchange_n (pauli
, eli
);
441 long long rulli
= exchange_n (paulli
, elli
);
443 sink (ruc
, rusi
, rui
, ruli
, rulli
);
447 void warn_atomic_exchange_n (void)
449 _Atomic
char *pc
= &eac
+ 1;
450 char rc
= exchange_n (pc
, ecc
); // { dg-warning "-Wstringop-overflow" }
453 _Atomic
short *psi
= (_Atomic
short*)((char*)&easi
+ 1);
454 rsi
[0] = exchange_n (psi
, ecsi
); // { dg-warning "-Wstringop-overflow" }
455 psi
= (_Atomic
short*)((char*)&easi
+ 2);
456 rsi
[1] = exchange_n (psi
, ecsi
); // { dg-warning "-Wstringop-overflow" }
459 _Atomic
int *pi
= (_Atomic
int*)((char*)&eai
+ 1);
460 ri
[0] = exchange_n (pi
, eci
); // { dg-warning "-Wstringop-overflow" }
461 pi
= (_Atomic
int*)((char*)&eai
+ 2);
462 ri
[1] = exchange_n (pi
, eci
); // { dg-warning "-Wstringop-overflow" }
463 pi
= (_Atomic
int*)((char*)&eai
+ sizeof eai
);
464 ri
[2] = exchange_n (pi
, eci
); // { dg-warning "-Wstringop-overflow" }
467 _Atomic
long *pli
= (_Atomic
long*)((char*)&eali
+ 1);
468 rli
[0] = exchange_n (pli
, ecli
); // { dg-warning "-Wstringop-overflow" }
469 pli
= (_Atomic
long*)((char*)&eali
+ 1);
470 rli
[1] = exchange_n (pli
, ecli
); // { dg-warning "-Wstringop-overflow" }
472 rli
[2] = exchange_n (pli
, ecli
); // { dg-warning "-Wstringop-overflow" }
475 _Atomic
long long *plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
476 rlli
[0] = exchange_n (plli
, eclli
); // { dg-warning "-Wstringop-overflow" }
477 plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
478 rlli
[1] = exchange_n (plli
, eclli
); // { dg-warning "-Wstringop-overflow" }
480 rlli
[2] = exchange_n (plli
, eclli
); // { dg-warning "-Wstringop-overflow" }
482 sink (&rc
, rsi
, ri
, rli
, rlli
);
486 void warn_atomic_compare_exchange (void)
488 _Atomic
char *pc
= &eac
+ 1;
489 cmpxchg (pc
, &ec
, &ecc
); // { dg-warning "-Wstringop-overflow" }
491 _Atomic
short *psi
= (_Atomic
short*)((char*)&easi
+ 1);
492 cmpxchg (psi
, &esi
, &ecsi
); // { dg-warning "-Wstringop-overflow" }
493 psi
= (_Atomic
short*)((char*)&easi
+ 2);
494 cmpxchg (psi
, &esi
, &ecsi
); // { dg-warning "-Wstringop-overflow" }
496 _Atomic
int *pi
= (_Atomic
int*)((char*)&eai
+ 1);
497 cmpxchg (pi
, &ei
, &eci
); // { dg-warning "-Wstringop-overflow" }
498 pi
= (_Atomic
int*)((char*)&eai
+ 2);
499 cmpxchg (pi
, &ei
, &eci
); // { dg-warning "-Wstringop-overflow" }
500 pi
= (_Atomic
int*)((char*)&eai
+ sizeof eai
);
501 cmpxchg (pi
, &ei
, &eci
); // { dg-warning "-Wstringop-overflow" }
503 _Atomic
long *pli
= (_Atomic
long*)((char*)&eali
+ 1);
504 cmpxchg (pli
, &eli
, &ecli
); // { dg-warning "-Wstringop-overflow" }
505 pli
= (_Atomic
long*)((char*)&eali
+ 1);
506 cmpxchg (pli
, &eli
, &ecli
); // { dg-warning "-Wstringop-overflow" }
508 cmpxchg (pli
, &eli
, &ecli
); // { dg-warning "-Wstringop-overflow" }
510 _Atomic
long long *plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
511 cmpxchg (plli
, &elli
, &eclli
); // { dg-warning "-Wstringop-overflow" }
512 plli
= (_Atomic
long long*)((char*)&ealli
+ 1);
513 cmpxchg (plli
, &elli
, &eclli
); // { dg-warning "-Wstringop-overflow" }
515 cmpxchg (plli
, &elli
, &eclli
); // { dg-warning "-Wstringop-overflow" }