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
3 optimization enabled.
4 { dg-do compile }
5 { dg-options "-O3 -Wall -ftrack-macro-expansion=0" } */
6
7 #ifndef __cplusplus
8 # define bool _Bool
9 #endif
10
11 #define NOIPA __attribute__ ((noipa))
12
13 #define add_fetch(p, q) __atomic_add_fetch (p, q, 0)
14 #define sub_fetch(p, q) __atomic_sub_fetch (p, q, 0)
15 #define and_fetch(p, q) __atomic_and_fetch (p, q, 0)
16 #define or_fetch(p, q) __atomic_or_fetch (p, q, 0)
17 #define xor_fetch(p, q) __atomic_xor_fetch (p, q, 0)
18 #define nand_fetch(p, q) __atomic_nand_fetch (p, q, 0)
19 #define exchange(p, q, r) __atomic_exchange (p, q, r, 0)
20 #define exchange_n(p, n) __atomic_exchange_n (p, n, 0)
21 #define cmpxchg(p, q, r) __atomic_compare_exchange (p, q, r, __COUNTER__, 0, 0)
22
23 typedef __SIZE_TYPE__ size_t;
24
25 void sink (void*, ...);
26 #define sink(...) sink (0, __VA_ARGS__)
27
28 extern _Bool eb;
29 extern char ec;
30 extern short int esi;
31 extern int ei;
32 extern long int eli;
33 extern long long int elli;
34
35 extern const _Bool ecb;
36 extern const char ecc;
37 extern const short int ecsi;
38 extern const int eci;
39 extern const long int ecli;
40 extern const long long int eclli;
41
42 extern _Atomic _Bool eab;
43 extern _Atomic char eac;
44 extern _Atomic short int easi;
45 extern _Atomic int eai;
46 extern _Atomic long int eali;
47 extern _Atomic long long int ealli;
48
49 extern _Atomic const _Bool eacb;
50 extern _Atomic const char eacc;
51 extern _Atomic const short int eacsi;
52 extern _Atomic const int eaci;
53 extern _Atomic const long int eacli;
54 extern _Atomic const long long int eaclli;
55
56
57 NOIPA void nowarn_atomic_add_fetch (void)
58 {
59 add_fetch (&eac, ecc);
60 add_fetch (&easi, esi);
61 add_fetch (&eai, ei);
62 add_fetch (&eali, eli);
63 add_fetch (&ealli, elli);
64 }
65
66
67 NOIPA void warn_atomic_add_fetch (void)
68 {
69 _Atomic char *pc = &eac + 1;
70 add_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
71
72 _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
73 add_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
74 psi = (_Atomic short*)((char*)&easi + 2);
75 add_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
76
77 _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
78 add_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
79 pi = (_Atomic int*)((char*)&eai + 2);
80 add_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
81 pi = (_Atomic int*)((char*)&eai + sizeof eai);
82 add_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
83
84 _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
85 add_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
86 pli = (_Atomic long*)((char*)&eali + 1);
87 add_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
88 pli = &eali + 1;
89 add_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
90
91 _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
92 add_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
93 plli = (_Atomic long long*)((char*)&ealli + 1);
94 add_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
95 plli = &ealli + 1;
96 add_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
97 }
98
99
100 NOIPA void nowarn_atomic_sub_fetch (void)
101 {
102 _Atomic char *pc = &eac;
103 sub_fetch (pc, ecc);
104
105 _Atomic short *psi = &easi;
106 sub_fetch (psi, esi);
107
108 _Atomic int *pi = &eai;
109 sub_fetch (pi, ei);
110
111 _Atomic long *pli = &eali;
112 sub_fetch (pli, eli);
113
114 _Atomic long long *plli = &ealli;
115 sub_fetch (plli, elli);
116 }
117
118
119 NOIPA void warn_atomic_sub_fetch (void)
120 {
121 _Atomic char *pc = &eac + 1;
122 sub_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
123
124 _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
125 sub_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
126 psi = (_Atomic short*)((char*)&easi + 2);
127 sub_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
128
129 _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
130 sub_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
131 pi = (_Atomic int*)((char*)&eai + 2);
132 sub_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
133 pi = (_Atomic int*)((char*)&eai + sizeof eai);
134 sub_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
135
136 _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
137 sub_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
138 pli = (_Atomic long*)((char*)&eali + 1);
139 sub_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
140 pli = &eali + 1;
141 sub_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
142
143 _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
144 sub_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
145 plli = (_Atomic long long*)((char*)&ealli + 1);
146 sub_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
147 plli = &ealli + 1;
148 sub_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
149 }
150
151
152 NOIPA void nowarn_atomic_and_fetch (void)
153 {
154 _Atomic char *pc = &eac;
155 and_fetch (pc, ecc);
156
157 _Atomic short *psi = &easi;
158 and_fetch (psi, esi);
159
160 _Atomic int *pi = &eai;
161 and_fetch (pi, ei);
162
163 _Atomic long *pli = &eali;
164 and_fetch (pli, eli);
165
166 _Atomic long long *plli = &ealli;
167 and_fetch (plli, elli);
168 }
169
170
171 NOIPA void warn_atomic_and_fetch (void)
172 {
173 _Atomic char *pc = &eac + 1;
174 and_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
175
176 _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
177 and_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
178 psi = (_Atomic short*)((char*)&easi + 2);
179 and_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
180
181 _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
182 and_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
183 pi = (_Atomic int*)((char*)&eai + 2);
184 and_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
185 pi = (_Atomic int*)((char*)&eai + sizeof eai);
186 and_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
187
188 _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
189 and_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
190 pli = (_Atomic long*)((char*)&eali + 1);
191 and_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
192 pli = &eali + 1;
193 and_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
194
195 _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
196 and_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
197 plli = (_Atomic long long*)((char*)&ealli + 1);
198 and_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
199 plli = &ealli + 1;
200 and_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
201 }
202
203
204 NOIPA void nowarn_atomic_or_fetch (void)
205 {
206 _Atomic char *pc = &eac;
207 or_fetch (pc, ecc);
208
209 _Atomic short *psi = &easi;
210 or_fetch (psi, esi);
211
212 _Atomic int *pi = &eai;
213 or_fetch (pi, ei);
214
215 _Atomic long *pli = &eali;
216 or_fetch (pli, eli);
217
218 _Atomic long long *plli = &ealli;
219 or_fetch (plli, elli);
220 }
221
222
223 NOIPA void warn_atomic_or_fetch (void)
224 {
225 _Atomic char *pc = &eac + 1;
226 or_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
227
228 _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
229 or_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
230 psi = (_Atomic short*)((char*)&easi + 2);
231 or_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
232
233 _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
234 or_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
235 pi = (_Atomic int*)((char*)&eai + 2);
236 or_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
237 pi = (_Atomic int*)((char*)&eai + sizeof eai);
238 or_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
239
240 _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
241 or_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
242 pli = (_Atomic long*)((char*)&eali + 1);
243 or_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
244 pli = &eali + 1;
245 or_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
246
247 _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
248 or_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
249 plli = (_Atomic long long*)((char*)&ealli + 1);
250 or_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
251 plli = &ealli + 1;
252 or_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
253 }
254
255
256 NOIPA void nowarn_atomic_xor_fetch (void)
257 {
258 _Atomic char *pc = &eac;
259 xor_fetch (pc, ecc);
260
261 _Atomic short *psi = &easi;
262 xor_fetch (psi, esi);
263
264 _Atomic int *pi = &eai;
265 xor_fetch (pi, ei);
266
267 _Atomic long *pli = &eali;
268 xor_fetch (pli, eli);
269
270 _Atomic long long *plli = &ealli;
271 xor_fetch (plli, elli);
272 }
273
274
275 NOIPA void warn_atomic_xor_fetch (void)
276 {
277 _Atomic char *pc = &eac + 1;
278 xor_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
279
280 _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
281 xor_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
282 psi = (_Atomic short*)((char*)&easi + 1);
283 xor_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
284
285 _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
286 xor_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
287 pi = (_Atomic int*)((char*)&eai + 2);
288 xor_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
289 pi = (_Atomic int*)((char*)&eai + sizeof eai);
290 xor_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
291
292 _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
293 xor_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
294 pli = (_Atomic long*)((char*)&eali + 1);
295 xor_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
296 pli = &eali + 1;
297 xor_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
298
299 _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
300 xor_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
301 plli = (_Atomic long long*)((char*)&eali + 1);
302 xor_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
303 plli = &ealli + 1;
304 xor_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
305 }
306
307
308 NOIPA void nowarn_atomic_nand_fetch (void)
309 {
310 _Atomic char *pc = &eac;
311 nand_fetch (pc, ecc);
312
313 _Atomic short *psi = &easi;
314 nand_fetch (psi, esi);
315
316 _Atomic int *pi = &eai;
317 nand_fetch (pi, ei);
318
319 _Atomic long *pli = &eali;
320 nand_fetch (pli, eli);
321
322 _Atomic long long *plli = &ealli;
323 nand_fetch (plli, elli);
324 }
325
326
327 NOIPA void warn_atomic_nand_fetch (void)
328 {
329 _Atomic char *pc = &eac + 1;
330 nand_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
331
332 _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
333 nand_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
334 psi = (_Atomic short*)((char*)&easi + 1);
335 nand_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
336
337 _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
338 nand_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
339 pi = (_Atomic int*)((char*)&eai + 2);
340 nand_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
341 pi = (_Atomic int*)((char*)&eai + sizeof eai);
342 nand_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
343
344 _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
345 nand_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
346 pli = (_Atomic long*)((char*)&eali + 1);
347 nand_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
348 pli = &eali + 1;
349 nand_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
350
351 _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
352 nand_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
353 plli = (_Atomic long long*)((char*)&eai + 1);
354 nand_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
355 plli = &ealli + 1;
356 nand_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
357 }
358
359
360 NOIPA void nowarn_atomic_exchange (void)
361 {
362 char rc;
363 _Atomic char *pc = &eac;
364 exchange (pc, &ecc, &rc);
365
366 short rsi;
367 _Atomic short *psi = &easi;
368 exchange (psi, &esi, &rsi);
369
370 int ri;
371 _Atomic int *pi = &eai;
372 exchange (pi, &ei, &ri);
373
374 long rli;
375 _Atomic long *pli = &eali;
376 exchange (pli, &eli, &rli);
377
378 long long rlli;
379 _Atomic long long *plli = &ealli;
380 exchange (plli, &elli, &rlli);
381
382 sink (&rc, &rsi, &ri, &rli, &rlli);
383 }
384
385 NOIPA void warn_atomic_exchange (void)
386 {
387 char rc;
388 _Atomic char *pc = &eac + 1;
389 exchange (pc, &ecc, &rc); // { dg-warning "-Wstringop-overflow" }
390
391 short rsi[2];
392 _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
393 exchange (psi, &ecsi, rsi); // { dg-warning "-Wstringop-overflow" }
394 psi = (_Atomic short*)((char*)&easi + 2);
395 exchange (psi, &ecsi, rsi + 1); // { dg-warning "-Wstringop-overflow" }
396
397 int ri[3];
398 _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
399 exchange (pi, &eci, ri); // { dg-warning "-Wstringop-overflow" }
400 pi = (_Atomic int*)((char*)&eai + 2);
401 exchange (pi, &eci, ri + 1); // { dg-warning "-Wstringop-overflow" }
402 pi = (_Atomic int*)((char*)&eai + sizeof eai);
403 exchange (pi, &eci, ri + 2); // { dg-warning "-Wstringop-overflow" }
404
405 long rli[3];
406 _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
407 exchange (pli, &ecli, rli); // { dg-warning "-Wstringop-overflow" }
408 pli = (_Atomic long*)((char*)&eali + 1);
409 exchange (pli, &ecli, rli + 1); // { dg-warning "-Wstringop-overflow" }
410 pli = &eali + 1;
411 exchange (pli, &ecli, rli + 2); // { dg-warning "-Wstringop-overflow" }
412
413 long long rlli[3];
414 _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
415 exchange (plli, &eclli, rlli); // { dg-warning "-Wstringop-overflow" }
416 plli = (_Atomic long long*)((char*)&ealli + 1);
417 exchange (plli, &eclli, rlli + 1); // { dg-warning "-Wstringop-overflow" }
418 plli = &ealli + 1;
419 exchange (plli, &eclli, rlli + 2); // { dg-warning "-Wstringop-overflow" }
420
421 sink (&rc, rsi, ri, rli, rlli);
422 }
423
424
425 NOIPA void nowarn_atomic_exchange_n (_Atomic unsigned char *pauc,
426 _Atomic unsigned short *pausi,
427 _Atomic unsigned int *paui,
428 _Atomic unsigned long *pauli,
429 _Atomic unsigned long long *paulli)
430 {
431 char rc = exchange_n (&eac, ecc);
432 short rsi = exchange_n (&easi, esi);
433 int ri = exchange_n (&eai, ei);
434 long rli = exchange_n (&eali, eli);
435 long long rlli = exchange_n (&ealli, elli);
436
437 sink (rc, rsi, ri, rli, rlli);
438
439 char ruc = exchange_n (pauc, ecc);
440 short rusi = exchange_n (pausi, esi);
441 int rui = exchange_n (paui, ei);
442 long ruli = exchange_n (pauli, eli);
443 long long rulli = exchange_n (paulli, elli);
444
445 sink (ruc, rusi, rui, ruli, rulli);
446 }
447
448
449 NOIPA void warn_atomic_exchange_n (void)
450 {
451 _Atomic char *pc = &eac + 1;
452 char rc = exchange_n (pc, ecc); // { dg-warning "-Wstringop-overflow" }
453
454 short rsi[2];
455 _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
456 rsi[0] = exchange_n (psi, ecsi); // { dg-warning "-Wstringop-overflow" }
457 psi = (_Atomic short*)((char*)&easi + 2);
458 rsi[1] = exchange_n (psi, ecsi); // { dg-warning "-Wstringop-overflow" }
459
460 int ri[3];
461 _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
462 ri[0] = exchange_n (pi, eci); // { dg-warning "-Wstringop-overflow" }
463 pi = (_Atomic int*)((char*)&eai + 2);
464 ri[1] = exchange_n (pi, eci); // { dg-warning "-Wstringop-overflow" }
465 pi = (_Atomic int*)((char*)&eai + sizeof eai);
466 ri[2] = exchange_n (pi, eci); // { dg-warning "-Wstringop-overflow" }
467
468 long rli[3];
469 _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
470 rli[0] = exchange_n (pli, ecli); // { dg-warning "-Wstringop-overflow" }
471 pli = (_Atomic long*)((char*)&eali + 1);
472 rli[1] = exchange_n (pli, ecli); // { dg-warning "-Wstringop-overflow" }
473 pli = &eali + 1;
474 rli[2] = exchange_n (pli, ecli); // { dg-warning "-Wstringop-overflow" }
475
476 long long rlli[3];
477 _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
478 rlli[0] = exchange_n (plli, eclli); // { dg-warning "-Wstringop-overflow" }
479 plli = (_Atomic long long*)((char*)&ealli + 1);
480 rlli[1] = exchange_n (plli, eclli); // { dg-warning "-Wstringop-overflow" }
481 plli = &ealli + 1;
482 rlli[2] = exchange_n (plli, eclli); // { dg-warning "-Wstringop-overflow" }
483
484 sink (&rc, rsi, ri, rli, rlli);
485 }
486
487
488 NOIPA void warn_atomic_compare_exchange (void)
489 {
490 _Atomic char *pc = &eac + 1;
491 cmpxchg (pc, &ec, &ecc); // { dg-warning "-Wstringop-overflow" }
492
493 _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
494 cmpxchg (psi, &esi, &ecsi); // { dg-warning "-Wstringop-overflow" }
495 psi = (_Atomic short*)((char*)&easi + 2);
496 cmpxchg (psi, &esi, &ecsi); // { dg-warning "-Wstringop-overflow" }
497
498 _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
499 cmpxchg (pi, &ei, &eci); // { dg-warning "-Wstringop-overflow" }
500 pi = (_Atomic int*)((char*)&eai + 2);
501 cmpxchg (pi, &ei, &eci); // { dg-warning "-Wstringop-overflow" }
502 pi = (_Atomic int*)((char*)&eai + sizeof eai);
503 cmpxchg (pi, &ei, &eci); // { dg-warning "-Wstringop-overflow" }
504
505 _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
506 cmpxchg (pli, &eli, &ecli); // { dg-warning "-Wstringop-overflow" }
507 pli = (_Atomic long*)((char*)&eali + 1);
508 cmpxchg (pli, &eli, &ecli); // { dg-warning "-Wstringop-overflow" }
509 pli = &eali + 1;
510 cmpxchg (pli, &eli, &ecli); // { dg-warning "-Wstringop-overflow" }
511
512 _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
513 cmpxchg (plli, &elli, &eclli); // { dg-warning "-Wstringop-overflow" }
514 plli = (_Atomic long long*)((char*)&ealli + 1);
515 cmpxchg (plli, &elli, &eclli); // { dg-warning "-Wstringop-overflow" }
516 plli = &ealli + 1;
517 cmpxchg (plli, &elli, &eclli); // { dg-warning "-Wstringop-overflow" }
518 }