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.
3 { dg-do compile }
4 { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
5
6 #ifndef __cplusplus
7 # define bool _Bool
8 #endif
9
10 #define load __atomic_load
11 #define store __atomic_store
12 #define add_fetch __atomic_add_fetch
13 #define sub_fetch __atomic_sub_fetch
14 #define and_fetch __atomic_and_fetch
15 #define or_fetch __atomic_or_fetch
16 #define xor_fetch __atomic_xor_fetch
17 #define nand_fetch __atomic_nand_fetch
18
19 typedef __SIZE_TYPE__ size_t;
20
21 void sink (void*, ...);
22 #define sink(...) sink (0, __VA_ARGS__)
23
24 extern _Bool eb;
25 extern char ec;
26 extern short int esi;
27 extern int ei;
28 extern long int eli;
29 extern long long int elli;
30
31 extern const _Bool ecb;
32 extern const char ecc;
33 extern const short int ecsi;
34 extern const int eci;
35 extern const long int ecli;
36 extern const long long int eclli;
37
38 extern _Atomic _Bool eab;
39 extern _Atomic char eac;
40 extern _Atomic short int easi;
41 extern _Atomic int eai;
42 extern _Atomic long int eali;
43 extern _Atomic long long int ealli;
44
45 extern _Atomic const _Bool eacb;
46 extern _Atomic const char eacc;
47 extern _Atomic const short int eacsi;
48 extern _Atomic const int eaci;
49 extern _Atomic const long int eacli;
50 extern _Atomic const long long int eaclli;
51
52
53 void nowarn_atomic_load (void)
54 {
55 load (&eacb, &eb, 0);
56 load (&eacc, &ec, 0);
57 load (&eacsi, &esi, 0);
58 load (&eaci, &ei, 0);
59 load (&eacli, &eli, 0);
60 load (&eaclli, &elli, 0);
61 }
62
63
64 void warn_atomic_load_note (void)
65 {
66 int i; // { dg-message "'i'" }
67
68 int *pi = (int*)((char*)&i + 1);
69 load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
70 sink (&i);
71
72 pi = (int*)((char*)&i + 2);
73 load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
74 sink (&i);
75
76 pi = &i + 1;
77 load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
78 sink (&i);
79 }
80
81
82 void warn_atomic_load (void)
83 {
84 bool *pb = &eb + 1;
85 load (&eacb, pb, 0); // { dg-warning "-Warray-bounds" }
86
87 char *pc = &ec + 1;
88 load (&eacc, pc, 0); // { dg-warning "-Warray-bounds" }
89
90 short *psi = (short*)((char*)&esi + 1);
91 load (&eacsi, psi, 0); // { dg-warning "-Warray-bounds" }
92 psi = (short*)((char*)&esi + 2);
93 load (&eacsi, psi, 0); // { dg-warning "-Warray-bounds" }
94
95 int *pi = (int*)((char*)&ei + 1);
96 load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
97 pi = (int*)((char*)&ei + 2);
98 load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
99 pi = (int*)((char*)&ei + sizeof ei);
100 load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
101
102 long *pli = (long*)((char*)&eli + 1);
103 load (&eacli, pli, 0); // { dg-warning "-Warray-bounds" }
104 pli = (long*)((char*)&eli + 1);
105 load (&eacli, pli, 0); // { dg-warning "-Warray-bounds" }
106 pli = &eli + 1;
107 load (&eacli, pli, 0); // { dg-warning "-Warray-bounds" }
108
109 long long *plli = (long long*)((char*)&elli + 1);
110 load (&eaclli, plli, 0); // { dg-warning "-Warray-bounds" }
111 plli = (long long*)((char*)&elli + 1);
112 load (&eaclli, plli, 0); // { dg-warning "-Warray-bounds" }
113 plli = &elli + 1;
114 load (&eaclli, plli, 0); // { dg-warning "-Warray-bounds" }
115 }
116
117
118 void warn_atomic_store (void)
119 {
120 const bool *pb = &eb + 1;
121 store (&eab, pb, 0); // { dg-warning "-Warray-bounds" }
122
123 const char *pc = &ec + 1;
124 store (&eac, pc, 0); // { dg-warning "-Warray-bounds" }
125
126 const short *psi = (const short*)((const char*)&ecsi + 1);
127 store (&easi, psi, 0); // { dg-warning "-Warray-bounds" }
128 psi = (const short*)((const char*)&esi + 2);
129 store (&easi, psi, 0); // { dg-warning "-Warray-bounds" }
130
131 const int *pi = (const int*)((const char*)&eci + 1);
132 store (&eai, pi, 0); // { dg-warning "-Warray-bounds" }
133 pi = (const int*)((const char*)&ei + 2);
134 store (&eai, pi, 0); // { dg-warning "-Warray-bounds" }
135 pi = (const int*)((const char*)&ei + sizeof ei);
136 store (&eai, pi, 0); // { dg-warning "-Warray-bounds" }
137
138 const long *pli = (const long*)((const char*)&eli + 1);
139 store (&eali, pli, 0); // { dg-warning "-Warray-bounds" }
140 pli = (const long*)((const char*)&eli + sizeof (eli));
141 store (&eali, pli, 0); // { dg-warning "-Warray-bounds" }
142
143 const long long *plli = (const long long*)((const char*)&elli + 1);
144 store (&ealli, plli, 0); // { dg-warning "-Warray-bounds" }
145 plli = (const long long*)((const char*)&elli + sizeof elli);
146 store (&ealli, plli, 0); // { dg-warning "-Warray-bounds" }
147 }