(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Warray-bounds-90.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.
       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  }