/* 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" } }