blob: 1ff60778e88bf4245829feb003702ec4f67de1dc [file] [log] [blame]
/* PR middle-end/102453 - buffer overflow by atomic built-ins not diagnosed
Verify that out-of-bounds accesses by atomic functions are diagnosed.
{ dg-do compile }
{ dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
#ifndef __cplusplus
# define bool _Bool
#endif
#define load __atomic_load
#define store __atomic_store
#define add_fetch __atomic_add_fetch
#define sub_fetch __atomic_sub_fetch
#define and_fetch __atomic_and_fetch
#define or_fetch __atomic_or_fetch
#define xor_fetch __atomic_xor_fetch
#define nand_fetch __atomic_nand_fetch
typedef __SIZE_TYPE__ size_t;
void sink (void*, ...);
#define sink(...) sink (0, __VA_ARGS__)
extern _Bool eb;
extern char ec;
extern short int esi;
extern int ei;
extern long int eli;
extern long long int elli;
extern const _Bool ecb;
extern const char ecc;
extern const short int ecsi;
extern const int eci;
extern const long int ecli;
extern const long long int eclli;
extern _Atomic _Bool eab;
extern _Atomic char eac;
extern _Atomic short int easi;
extern _Atomic int eai;
extern _Atomic long int eali;
extern _Atomic long long int ealli;
extern _Atomic const _Bool eacb;
extern _Atomic const char eacc;
extern _Atomic const short int eacsi;
extern _Atomic const int eaci;
extern _Atomic const long int eacli;
extern _Atomic const long long int eaclli;
void nowarn_atomic_load (void)
{
load (&eacb, &eb, 0);
load (&eacc, &ec, 0);
load (&eacsi, &esi, 0);
load (&eaci, &ei, 0);
load (&eacli, &eli, 0);
load (&eaclli, &elli, 0);
}
void warn_atomic_load_note (void)
{
int i; // { dg-message "'i'" }
int *pi = (int*)((char*)&i + 1);
load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
sink (&i);
pi = (int*)((char*)&i + 2);
load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
sink (&i);
pi = &i + 1;
load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
sink (&i);
}
void warn_atomic_load (void)
{
bool *pb = &eb + 1;
load (&eacb, pb, 0); // { dg-warning "-Warray-bounds" }
char *pc = &ec + 1;
load (&eacc, pc, 0); // { dg-warning "-Warray-bounds" }
short *psi = (short*)((char*)&esi + 1);
load (&eacsi, psi, 0); // { dg-warning "-Warray-bounds" }
psi = (short*)((char*)&esi + 2);
load (&eacsi, psi, 0); // { dg-warning "-Warray-bounds" }
int *pi = (int*)((char*)&ei + 1);
load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
pi = (int*)((char*)&ei + 2);
load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
pi = (int*)((char*)&ei + sizeof ei);
load (&eaci, pi, 0); // { dg-warning "-Warray-bounds" }
long *pli = (long*)((char*)&eli + 1);
load (&eacli, pli, 0); // { dg-warning "-Warray-bounds" }
pli = (long*)((char*)&eli + 1);
load (&eacli, pli, 0); // { dg-warning "-Warray-bounds" }
pli = &eli + 1;
load (&eacli, pli, 0); // { dg-warning "-Warray-bounds" }
long long *plli = (long long*)((char*)&elli + 1);
load (&eaclli, plli, 0); // { dg-warning "-Warray-bounds" }
plli = (long long*)((char*)&elli + 1);
load (&eaclli, plli, 0); // { dg-warning "-Warray-bounds" }
plli = &elli + 1;
load (&eaclli, plli, 0); // { dg-warning "-Warray-bounds" }
}
void warn_atomic_store (void)
{
const bool *pb = &eb + 1;
store (&eab, pb, 0); // { dg-warning "-Warray-bounds" }
const char *pc = &ec + 1;
store (&eac, pc, 0); // { dg-warning "-Warray-bounds" }
const short *psi = (const short*)((const char*)&ecsi + 1);
store (&easi, psi, 0); // { dg-warning "-Warray-bounds" }
psi = (const short*)((const char*)&esi + 2);
store (&easi, psi, 0); // { dg-warning "-Warray-bounds" }
const int *pi = (const int*)((const char*)&eci + 1);
store (&eai, pi, 0); // { dg-warning "-Warray-bounds" }
pi = (const int*)((const char*)&ei + 2);
store (&eai, pi, 0); // { dg-warning "-Warray-bounds" }
pi = (const int*)((const char*)&ei + sizeof ei);
store (&eai, pi, 0); // { dg-warning "-Warray-bounds" }
const long *pli = (const long*)((const char*)&eli + 1);
store (&eali, pli, 0); // { dg-warning "-Warray-bounds" }
pli = (const long*)((const char*)&eli + sizeof (eli));
store (&eali, pli, 0); // { dg-warning "-Warray-bounds" }
const long long *plli = (const long long*)((const char*)&elli + 1);
store (&ealli, plli, 0); // { dg-warning "-Warray-bounds" }
plli = (const long long*)((const char*)&elli + sizeof elli);
store (&ealli, plli, 0); // { dg-warning "-Warray-bounds" }
}