blob: 732f56849ae8aa2e7ab6cd6e92ecb9f1a872e80e [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 with
optimization disabled.
{ dg-do compile }
{ dg-options "-O0 -Wall -ftrack-macro-expansion=0" } */
#ifndef __cplusplus
# define bool _Bool
#endif
#define add_fetch(p, q) __atomic_add_fetch (p, q, 0)
#define sub_fetch(p, q) __atomic_sub_fetch (p, q, 0)
#define and_fetch(p, q) __atomic_and_fetch (p, q, 0)
#define or_fetch(p, q) __atomic_or_fetch (p, q, 0)
#define xor_fetch(p, q) __atomic_xor_fetch (p, q, 0)
#define nand_fetch(p, q) __atomic_nand_fetch (p, q, 0)
#define exchange(p, q, r) __atomic_exchange (p, q, r, 0)
#define exchange_n(p, n) __atomic_exchange_n (p, n, 0)
#define cmpxchg(p, q, r) __atomic_compare_exchange (p, q, r, 0, 0, 0)
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_add_fetch (void)
{
add_fetch (&eac, ecc);
add_fetch (&easi, esi);
add_fetch (&eai, ei);
add_fetch (&eali, eli);
add_fetch (&ealli, elli);
}
void warn_atomic_add_fetch (void)
{
_Atomic char *pc = &eac + 1;
add_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
_Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
add_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
psi = (_Atomic short*)((char*)&easi + 2);
add_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
_Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
add_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + 2);
add_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + sizeof eai);
add_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
_Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
add_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = (_Atomic long*)((char*)&eali + 1);
add_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = &eali + 1;
add_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
_Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
add_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
plli = (_Atomic long long*)((char*)&ealli + 1);
add_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
plli = &ealli + 1;
add_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
}
void nowarn_atomic_sub_fetch (void)
{
_Atomic char *pc = &eac;
sub_fetch (pc, ecc);
_Atomic short *psi = &easi;
sub_fetch (psi, esi);
_Atomic int *pi = &eai;
sub_fetch (pi, ei);
_Atomic long *pli = &eali;
sub_fetch (pli, eli);
_Atomic long long *plli = &ealli;
sub_fetch (plli, elli);
}
void warn_atomic_sub_fetch (void)
{
_Atomic char *pc = &eac + 1;
sub_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
_Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
sub_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
psi = (_Atomic short*)((char*)&easi + 2);
sub_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
_Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
sub_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + 2);
sub_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + sizeof eai);
sub_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
_Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
sub_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = (_Atomic long*)((char*)&eali + 1);
sub_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = &eali + 1;
sub_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
_Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
sub_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
plli = (_Atomic long long*)((char*)&ealli + 1);
sub_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
plli = &ealli + 1;
sub_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
}
void nowarn_atomic_and_fetch (void)
{
_Atomic char *pc = &eac;
and_fetch (pc, ecc);
_Atomic short *psi = &easi;
and_fetch (psi, esi);
_Atomic int *pi = &eai;
and_fetch (pi, ei);
_Atomic long *pli = &eali;
and_fetch (pli, eli);
_Atomic long long *plli = &ealli;
and_fetch (plli, elli);
}
void warn_atomic_and_fetch (void)
{
_Atomic char *pc = &eac + 1;
and_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
_Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
and_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
psi = (_Atomic short*)((char*)&easi + 2);
and_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
_Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
and_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + 2);
and_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + sizeof eai);
and_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
_Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
and_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = (_Atomic long*)((char*)&eali + 1);
and_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = &eali + 1;
and_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
_Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
and_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
plli = (_Atomic long long*)((char*)&ealli + 1);
and_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
plli = &ealli + 1;
and_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
}
void nowarn_atomic_or_fetch (void)
{
_Atomic char *pc = &eac;
or_fetch (pc, ecc);
_Atomic short *psi = &easi;
or_fetch (psi, esi);
_Atomic int *pi = &eai;
or_fetch (pi, ei);
_Atomic long *pli = &eali;
or_fetch (pli, eli);
_Atomic long long *plli = &ealli;
or_fetch (plli, elli);
}
void warn_atomic_or_fetch (void)
{
_Atomic char *pc = &eac + 1;
or_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
_Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
or_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
psi = (_Atomic short*)((char*)&easi + 2);
or_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
_Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
or_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + 2);
or_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + sizeof eai);
or_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
_Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
or_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = (_Atomic long*)((char*)&eali + 1);
or_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = &eali + 1;
or_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
_Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
or_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
plli = (_Atomic long long*)((char*)&ealli + 1);
or_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
plli = &ealli + 1;
or_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
}
void nowarn_atomic_xor_fetch (void)
{
_Atomic char *pc = &eac;
xor_fetch (pc, ecc);
_Atomic short *psi = &easi;
xor_fetch (psi, esi);
_Atomic int *pi = &eai;
xor_fetch (pi, ei);
_Atomic long *pli = &eali;
xor_fetch (pli, eli);
_Atomic long long *plli = &ealli;
xor_fetch (plli, elli);
}
void warn_atomic_xor_fetch (void)
{
_Atomic char *pc = &eac + 1;
xor_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
_Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
xor_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
psi = (_Atomic short*)((char*)&easi + 1);
xor_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
_Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
xor_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + 2);
xor_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + sizeof eai);
xor_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
_Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
xor_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = (_Atomic long*)((char*)&eali + 1);
xor_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = &eali + 1;
xor_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
_Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
xor_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
plli = (_Atomic long long*)((char*)&eali + 1);
xor_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
plli = &ealli + 1;
xor_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
}
void nowarn_atomic_nand_fetch (void)
{
_Atomic char *pc = &eac;
nand_fetch (pc, ecc);
_Atomic short *psi = &easi;
nand_fetch (psi, esi);
_Atomic int *pi = &eai;
nand_fetch (pi, ei);
_Atomic long *pli = &eali;
nand_fetch (pli, eli);
_Atomic long long *plli = &ealli;
nand_fetch (plli, elli);
}
void warn_atomic_nand_fetch (void)
{
_Atomic char *pc = &eac + 1;
nand_fetch (pc, ecc); // { dg-warning "-Wstringop-overflow" }
_Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
nand_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
psi = (_Atomic short*)((char*)&easi + 1);
nand_fetch (psi, esi); // { dg-warning "-Wstringop-overflow" }
_Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
nand_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + 2);
nand_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + sizeof eai);
nand_fetch (pi, ei); // { dg-warning "-Wstringop-overflow" }
_Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
nand_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = (_Atomic long*)((char*)&eali + 1);
nand_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
pli = &eali + 1;
nand_fetch (pli, eli); // { dg-warning "-Wstringop-overflow" }
_Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
nand_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
plli = (_Atomic long long*)((char*)&eai + 1);
nand_fetch (plli, eali); // { dg-warning "-Wstringop-overflow" }
plli = &ealli + 1;
nand_fetch (plli, elli); // { dg-warning "-Wstringop-overflow" }
}
void nowarn_atomic_exchange (void)
{
char rc;
_Atomic char *pc = &eac;
exchange (pc, &ecc, &rc);
short rsi;
_Atomic short *psi = &easi;
exchange (psi, &esi, &rsi);
int ri;
_Atomic int *pi = &eai;
exchange (pi, &ei, &ri);
long rli;
_Atomic long *pli = &eali;
exchange (pli, &eli, &rli);
long long rlli;
_Atomic long long *plli = &ealli;
exchange (plli, &elli, &rlli);
sink (&rc, &rsi, &ri, &rli, &rlli);
}
void warn_atomic_exchange (void)
{
char rc;
_Atomic char *pc = &eac + 1;
exchange (pc, &ecc, &rc); // { dg-warning "-Wstringop-overflow" }
short rsi[2];
_Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
exchange (psi, &ecsi, rsi); // { dg-warning "-Wstringop-overflow" }
psi = (_Atomic short*)((char*)&easi + 2);
exchange (psi, &ecsi, rsi + 1); // { dg-warning "-Wstringop-overflow" }
int ri[3];
_Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
exchange (pi, &eci, ri); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + 2);
exchange (pi, &eci, ri + 1); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + sizeof eai);
exchange (pi, &eci, ri + 2); // { dg-warning "-Wstringop-overflow" }
long rli[3];
_Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
exchange (pli, &ecli, rli); // { dg-warning "-Wstringop-overflow" }
pli = (_Atomic long*)((char*)&eali + 1);
exchange (pli, &ecli, rli + 1); // { dg-warning "-Wstringop-overflow" }
pli = &eali + 1;
exchange (pli, &ecli, rli + 2); // { dg-warning "-Wstringop-overflow" }
long long rlli[3];
_Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
exchange (plli, &eclli, rlli); // { dg-warning "-Wstringop-overflow" }
plli = (_Atomic long long*)((char*)&ealli + 1);
exchange (plli, &eclli, rlli + 1); // { dg-warning "-Wstringop-overflow" }
plli = &ealli + 1;
exchange (plli, &eclli, rlli + 2); // { dg-warning "-Wstringop-overflow" }
sink (&rc, rsi, ri, rli, rlli);
}
void nowarn_atomic_exchange_n (_Atomic unsigned char *pauc,
_Atomic unsigned short *pausi,
_Atomic unsigned int *paui,
_Atomic unsigned long *pauli,
_Atomic unsigned long long *paulli)
{
char rc = exchange_n (&eac, ecc);
short rsi = exchange_n (&easi, esi);
int ri = exchange_n (&eai, ei);
long rli = exchange_n (&eali, eli);
long long rlli = exchange_n (&ealli, elli);
sink (rc, rsi, ri, rli, rlli);
char ruc = exchange_n (pauc, ecc);
short rusi = exchange_n (pausi, esi);
int rui = exchange_n (paui, ei);
long ruli = exchange_n (pauli, eli);
long long rulli = exchange_n (paulli, elli);
sink (ruc, rusi, rui, ruli, rulli);
}
void warn_atomic_exchange_n (void)
{
_Atomic char *pc = &eac + 1;
char rc = exchange_n (pc, ecc); // { dg-warning "-Wstringop-overflow" }
short rsi[2];
_Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
rsi[0] = exchange_n (psi, ecsi); // { dg-warning "-Wstringop-overflow" }
psi = (_Atomic short*)((char*)&easi + 2);
rsi[1] = exchange_n (psi, ecsi); // { dg-warning "-Wstringop-overflow" }
int ri[3];
_Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
ri[0] = exchange_n (pi, eci); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + 2);
ri[1] = exchange_n (pi, eci); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + sizeof eai);
ri[2] = exchange_n (pi, eci); // { dg-warning "-Wstringop-overflow" }
long rli[3];
_Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
rli[0] = exchange_n (pli, ecli); // { dg-warning "-Wstringop-overflow" }
pli = (_Atomic long*)((char*)&eali + 1);
rli[1] = exchange_n (pli, ecli); // { dg-warning "-Wstringop-overflow" }
pli = &eali + 1;
rli[2] = exchange_n (pli, ecli); // { dg-warning "-Wstringop-overflow" }
long long rlli[3];
_Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
rlli[0] = exchange_n (plli, eclli); // { dg-warning "-Wstringop-overflow" }
plli = (_Atomic long long*)((char*)&ealli + 1);
rlli[1] = exchange_n (plli, eclli); // { dg-warning "-Wstringop-overflow" }
plli = &ealli + 1;
rlli[2] = exchange_n (plli, eclli); // { dg-warning "-Wstringop-overflow" }
sink (&rc, rsi, ri, rli, rlli);
}
void warn_atomic_compare_exchange (void)
{
_Atomic char *pc = &eac + 1;
cmpxchg (pc, &ec, &ecc); // { dg-warning "-Wstringop-overflow" }
_Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
cmpxchg (psi, &esi, &ecsi); // { dg-warning "-Wstringop-overflow" }
psi = (_Atomic short*)((char*)&easi + 2);
cmpxchg (psi, &esi, &ecsi); // { dg-warning "-Wstringop-overflow" }
_Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
cmpxchg (pi, &ei, &eci); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + 2);
cmpxchg (pi, &ei, &eci); // { dg-warning "-Wstringop-overflow" }
pi = (_Atomic int*)((char*)&eai + sizeof eai);
cmpxchg (pi, &ei, &eci); // { dg-warning "-Wstringop-overflow" }
_Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
cmpxchg (pli, &eli, &ecli); // { dg-warning "-Wstringop-overflow" }
pli = (_Atomic long*)((char*)&eali + 1);
cmpxchg (pli, &eli, &ecli); // { dg-warning "-Wstringop-overflow" }
pli = &eali + 1;
cmpxchg (pli, &eli, &ecli); // { dg-warning "-Wstringop-overflow" }
_Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
cmpxchg (plli, &elli, &eclli); // { dg-warning "-Wstringop-overflow" }
plli = (_Atomic long long*)((char*)&ealli + 1);
cmpxchg (plli, &elli, &eclli); // { dg-warning "-Wstringop-overflow" }
plli = &ealli + 1;
cmpxchg (plli, &elli, &eclli); // { dg-warning "-Wstringop-overflow" }
}