]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.dg/Wstringop-overflow-77.c
Detect overflow by atomic functions [PR102453].
[thirdparty/gcc.git] / 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
3 optimization disabled.
4 { dg-do compile }
5 { dg-options "-O0 -Wall -ftrack-macro-expansion=0" } */
6
7 #ifndef __cplusplus
8 # define bool _Bool
9 #endif
10
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)
20
21 typedef __SIZE_TYPE__ size_t;
22
23 void sink (void*, ...);
24 #define sink(...) sink (0, __VA_ARGS__)
25
26 extern _Bool eb;
27 extern char ec;
28 extern short int esi;
29 extern int ei;
30 extern long int eli;
31 extern long long int elli;
32
33 extern const _Bool ecb;
34 extern const char ecc;
35 extern const short int ecsi;
36 extern const int eci;
37 extern const long int ecli;
38 extern const long long int eclli;
39
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;
46
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;
53
54
55 void nowarn_atomic_add_fetch (void)
56 {
57 add_fetch (&eac, ecc);
58 add_fetch (&easi, esi);
59 add_fetch (&eai, ei);
60 add_fetch (&eali, eli);
61 add_fetch (&ealli, elli);
62 }
63
64
65 void warn_atomic_add_fetch (void)
66 {
67 _Atomic char *pc = &eac + 1;
68 add_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
69
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" }
74
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" }
81
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" }
86 pli = &eali + 1;
87 add_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
88
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" }
93 plli = &ealli + 1;
94 add_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
95 }
96
97
98 void nowarn_atomic_sub_fetch (void)
99 {
100 _Atomic char *pc = &eac;
101 sub_fetch (pc, ecc);
102
103 _Atomic short *psi = &easi;
104 sub_fetch (psi, esi);
105
106 _Atomic int *pi = &eai;
107 sub_fetch (pi, ei);
108
109 _Atomic long *pli = &eali;
110 sub_fetch (pli, eli);
111
112 _Atomic long long *plli = &ealli;
113 sub_fetch (plli, elli);
114 }
115
116
117 void warn_atomic_sub_fetch (void)
118 {
119 _Atomic char *pc = &eac + 1;
120 sub_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
121
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" }
126
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" }
133
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" }
138 pli = &eali + 1;
139 sub_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
140
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" }
145 plli = &ealli + 1;
146 sub_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
147 }
148
149
150 void nowarn_atomic_and_fetch (void)
151 {
152 _Atomic char *pc = &eac;
153 and_fetch (pc, ecc);
154
155 _Atomic short *psi = &easi;
156 and_fetch (psi, esi);
157
158 _Atomic int *pi = &eai;
159 and_fetch (pi, ei);
160
161 _Atomic long *pli = &eali;
162 and_fetch (pli, eli);
163
164 _Atomic long long *plli = &ealli;
165 and_fetch (plli, elli);
166 }
167
168
169 void warn_atomic_and_fetch (void)
170 {
171 _Atomic char *pc = &eac + 1;
172 and_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
173
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" }
178
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" }
185
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" }
190 pli = &eali + 1;
191 and_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
192
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" }
197 plli = &ealli + 1;
198 and_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
199 }
200
201
202 void nowarn_atomic_or_fetch (void)
203 {
204 _Atomic char *pc = &eac;
205 or_fetch (pc, ecc);
206
207 _Atomic short *psi = &easi;
208 or_fetch (psi, esi);
209
210 _Atomic int *pi = &eai;
211 or_fetch (pi, ei);
212
213 _Atomic long *pli = &eali;
214 or_fetch (pli, eli);
215
216 _Atomic long long *plli = &ealli;
217 or_fetch (plli, elli);
218 }
219
220
221 void warn_atomic_or_fetch (void)
222 {
223 _Atomic char *pc = &eac + 1;
224 or_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
225
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" }
230
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" }
237
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" }
242 pli = &eali + 1;
243 or_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
244
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" }
249 plli = &ealli + 1;
250 or_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
251 }
252
253
254 void nowarn_atomic_xor_fetch (void)
255 {
256 _Atomic char *pc = &eac;
257 xor_fetch (pc, ecc);
258
259 _Atomic short *psi = &easi;
260 xor_fetch (psi, esi);
261
262 _Atomic int *pi = &eai;
263 xor_fetch (pi, ei);
264
265 _Atomic long *pli = &eali;
266 xor_fetch (pli, eli);
267
268 _Atomic long long *plli = &ealli;
269 xor_fetch (plli, elli);
270 }
271
272
273 void warn_atomic_xor_fetch (void)
274 {
275 _Atomic char *pc = &eac + 1;
276 xor_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
277
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" }
282
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" }
289
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" }
294 pli = &eali + 1;
295 xor_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
296
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" }
301 plli = &ealli + 1;
302 xor_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
303 }
304
305
306 void nowarn_atomic_nand_fetch (void)
307 {
308 _Atomic char *pc = &eac;
309 nand_fetch (pc, ecc);
310
311 _Atomic short *psi = &easi;
312 nand_fetch (psi, esi);
313
314 _Atomic int *pi = &eai;
315 nand_fetch (pi, ei);
316
317 _Atomic long *pli = &eali;
318 nand_fetch (pli, eli);
319
320 _Atomic long long *plli = &ealli;
321 nand_fetch (plli, elli);
322 }
323
324
325 void warn_atomic_nand_fetch (void)
326 {
327 _Atomic char *pc = &eac + 1;
328 nand_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
329
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" }
334
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" }
341
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" }
346 pli = &eali + 1;
347 nand_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
348
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" }
353 plli = &ealli + 1;
354 nand_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
355 }
356
357
358 void nowarn_atomic_exchange (void)
359 {
360 char rc;
361 _Atomic char *pc = &eac;
362 exchange (pc, &ecc, &rc);
363
364 short rsi;
365 _Atomic short *psi = &easi;
366 exchange (psi, &esi, &rsi);
367
368 int ri;
369 _Atomic int *pi = &eai;
370 exchange (pi, &ei, &ri);
371
372 long rli;
373 _Atomic long *pli = &eali;
374 exchange (pli, &eli, &rli);
375
376 long long rlli;
377 _Atomic long long *plli = &ealli;
378 exchange (plli, &elli, &rlli);
379
380 sink (&rc, &rsi, &ri, &rli, &rlli);
381 }
382
383 void warn_atomic_exchange (void)
384 {
385 char rc;
386 _Atomic char *pc = &eac + 1;
387 exchange (pc, &ecc, &rc); // { dg-warning "-Wstringop-overflow" }
388
389 short rsi[2];
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" }
394
395 int ri[3];
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" }
402
403 long rli[3];
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" }
408 pli = &eali + 1;
409 exchange (pli, &ecli, rli + 2); // { dg-warning "-Wstringop-overflow" }
410
411 long long rlli[3];
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" }
416 plli = &ealli + 1;
417 exchange (plli, &eclli, rlli + 2); // { dg-warning "-Wstringop-overflow" }
418
419 sink (&rc, rsi, ri, rli, rlli);
420 }
421
422
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)
428 {
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);
434
435 sink (rc, rsi, ri, rli, rlli);
436
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);
442
443 sink (ruc, rusi, rui, ruli, rulli);
444 }
445
446
447 void warn_atomic_exchange_n (void)
448 {
449 _Atomic char *pc = &eac + 1;
450 char rc = exchange_n (pc, ecc); // { dg-warning "-Wstringop-overflow" }
451
452 short rsi[2];
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" }
457
458 int ri[3];
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" }
465
466 long rli[3];
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" }
471 pli = &eali + 1;
472 rli[2] = exchange_n (pli, ecli); // { dg-warning "-Wstringop-overflow" }
473
474 long long rlli[3];
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" }
479 plli = &ealli + 1;
480 rlli[2] = exchange_n (plli, eclli); // { dg-warning "-Wstringop-overflow" }
481
482 sink (&rc, rsi, ri, rli, rlli);
483 }
484
485
486 void warn_atomic_compare_exchange (void)
487 {
488 _Atomic char *pc = &eac + 1;
489 cmpxchg (pc, &ec, &ecc); // { dg-warning "-Wstringop-overflow" }
490
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" }
495
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" }
502
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" }
507 pli = &eali + 1;
508 cmpxchg (pli, &eli, &ecli); // { dg-warning "-Wstringop-overflow" }
509
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" }
514 plli = &ealli + 1;
515 cmpxchg (plli, &elli, &eclli); // { dg-warning "-Wstringop-overflow" }
516 }