(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
Warray-bounds.c
       1  /* PR tree-optimization/82588 - missing -Warray-bounds on an excessively
       2     large index
       3     { dg-do compile }
       4     { dg-require-effective-target alloca }
       5     { dg-options "-O2 -Warray-bounds -Wno-stringop-overread -ftrack-macro-expansion=0" }  */
       6  
       7  #include "../gcc.dg/range.h"
       8  
       9  #define offsetof(T, m)   __builtin_offsetof (T, m)
      10  
      11  typedef struct AX { int n; char ax[]; } AX;
      12  
      13  typedef struct A1 { int i; char a1[1]; } A1;
      14  typedef struct B { int i; struct A1 a1x[]; } B;
      15  
      16  void sink (int, ...);
      17  
      18  #define R(min, max) signed_range (min, max)
      19  #define T(expr)     sink (0, expr)
      20  
      21  struct __attribute__ ((packed)) S16 { unsigned i: 16; };
      22  
      23  void farr_char (void)
      24  {
      25    extern char ac[];
      26  
      27    T (ac[DIFF_MIN]);                       /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .char *\\\[]." } */
      28    T (ac[-1]);                             /* { dg-warning "array subscript -1 is below array bounds" } */
      29    T (ac[0]);
      30  
      31    T (ac[DIFF_MAX - 1]);
      32    T (ac[DIFF_MAX]);                       /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      33    T (ac[DIFF_MAX + (size_t)1]);           /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      34    T (ac[SIZE_MAX]);                       /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      35    T (ac[R (DIFF_MAX - 1, DIFF_MAX)]);
      36    T (ac[R (DIFF_MIN + 1, -1)]);           /* { dg-warning "array subscript -1 is below array bounds" } */
      37    T (ac[R (DIFF_MIN + 1, 0)]);
      38    T (ac[R (-1, 0)]);
      39    T (ac[R (-1, 1)]);
      40  }
      41  
      42  void farr_s16 (void)
      43  {
      44    extern struct S16 ax[];
      45  
      46    T (ax[DIFF_MIN]);                       /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(struct )?S16 *\\\[]." } */
      47    T (ax[-1]);                             /* { dg-warning "array subscript -1 is below array bounds" } */
      48    T (ax[0]);
      49  
      50    T (ax[DIFF_MAX / 2 - 1]);               /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "llp64" { target llp64 } } */
      51    T (ax[DIFF_MAX / 2]);                   /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      52    T (ax[DIFF_MAX / 2 + (size_t)1]);       /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      53    T (ax[SIZE_MAX]);                       /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      54    T (ax[R (DIFF_MIN, -1)]);               /* { dg-warning "array subscript -1 is below array bounds" } */
      55    T (ax[R (DIFF_MAX / 2 - 1, DIFF_MAX)]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "llp64" { target llp64 } } */
      56    T (ax[R (DIFF_MAX / 2, DIFF_MAX)]);     /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      57  }
      58  
      59  void farr_s16_7 (void)
      60  {
      61    extern struct S16 ax_7[][7];
      62  
      63    T (ax_7[0][DIFF_MIN]);                  /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(struct )?S16 *\\\[7]." } */
      64    T (ax_7[0][-1]);                        /* { dg-warning "array subscript -1 is below array bounds" } */
      65    T (ax_7[0][0]);
      66    T (ax_7[0][7]);                         /* { dg-warning "array subscript 7 is above array bounds of .(struct )?S16 *\\\[7]." } */
      67    T (ax_7[0][8]);                         /* { dg-warning "array subscript 8 is above array bounds of .(struct )?S16 *\\\[7]." } */
      68  
      69    T (ax_7[0][DIFF_MAX / 2]);             /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      70    T (ax_7[0][SIZE_MAX]);                 /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      71  
      72    T (ax_7[DIFF_MIN][0]);                 /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(struct )?S16 *\\\[]\\\[7]." } */
      73    T (ax_7[-1][0]);                        /* { dg-warning "array subscript -1 is below array bounds" } */
      74  
      75    T (ax_7[DIFF_MAX / 2][0]);              /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      76    T (ax_7[SIZE_MAX][0]);                  /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      77  
      78    ptrdiff_t i = R (DIFF_MIN, -1);
      79    T (ax_7[i][0]);                         /* { dg-warning "array subscript -1 is below array bounds" } */
      80  
      81    T (ax_7[R (DIFF_MIN, -1)][0]);          /* { dg-warning "array subscript -1 is below array bounds" } */
      82    T (ax_7[R (DIFF_MIN, 0)][0]);
      83    T (ax_7[R (-2, -1)][0]);                /* { dg-warning "array subscript -1 is below array bounds" } */
      84    T (ax_7[R (-1, 0)][0]);
      85    T (ax_7[R (-1, 1)][0]);
      86    T (ax_7[R (-1, 7)][0]);
      87    T (ax_7[R (-1, DIFF_MAX)][0]);
      88  
      89    T (ax_7[R ( 1, DIFF_MAX)][0]);
      90    T (ax_7[R (DIFF_MAX / 14 - 1, DIFF_MAX)][0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "llp64" { target llp64 } } */
      91  
      92    i = R (DIFF_MAX / 14, DIFF_MAX);
      93    T (ax_7[i][0]);                         /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
      94  
      95    T (ax_7[0][R (DIFF_MIN, 0)]);
      96    T (ax_7[0][R (-1, 0)]);
      97    T (ax_7[0][R (-1, 1)]);
      98    T (ax_7[0][R (-1, 7)]);
      99    T (ax_7[0][R (-1, DIFF_MAX)]);
     100    T (ax_7[0][R (-1, DIFF_MAX)]);
     101  
     102    T (ax_7[0][R (1, DIFF_MAX)]);
     103    T (ax_7[0][R (7, DIFF_MAX)]);           /* { dg-warning "array subscript 7 is above array bounds" } */
     104  
     105  }
     106  
     107  void farr_x_5_7 (void)
     108  {
     109    extern struct S16 a[][5][7];
     110  
     111    T (a[0][0][-3]);                        /* { dg-warning "array subscript -3 is below array bounds of .(struct )?S16 *\\\[7]." } */
     112    T (a[0][-2][0]);                        /* { dg-warning "array subscript -2 is below array bounds of .(struct )?S16 *\\\[5]\\\[7]." } */
     113    T (a[-1][0][0]);                        /* { dg-warning "array subscript -1 is below array bounds of .(struct )?S16 *\\\[]\\\[5]\\\[7]." } */
     114    T (a[R (-4, -3)][0][0]);                /* { dg-warning "array subscript -3 is below array bounds" } */
     115    T (a[0][R (-3, -2)][0]);                /* { dg-warning "array subscript -2 is below array bounds" } */
     116    T (a[0][0][R (-2, -1)]);                /* { dg-warning "array subscript -1 is below array bounds" } */
     117  }
     118  
     119  
     120  void fax (struct AX *p)
     121  {
     122    T (p->ax[DIFF_MIN]);                   /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
     123    T (p->ax[-1]);                          /* { dg-warning "array subscript -1 is below array bounds" } */
     124    T (p->ax[0]);
     125    T (p->ax[DIFF_MAX - sizeof *p - 1]);
     126    T (p->ax[DIFF_MAX - sizeof *p]);        /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     127    T (p->ax[DIFF_MAX - sizeof *p + 1]);    /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     128    T (p->ax[SIZE_MAX]);                    /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     129    T (p->ax[R (DIFF_MIN, -1)]);            /* { dg-warning "array subscript -1 is below array bounds" } */
     130    T (p->ax[R (-1, 1)]);
     131    T (p->ax[R (0, DIFF_MAX - 1)]);
     132    T (p->ax[R (DIFF_MAX - 1, DIFF_MAX)]);/* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     133  }
     134  
     135  void fa1 (struct A1 *p)
     136  {
     137    T (p->a1[DIFF_MIN]);                    /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
     138    T (p->a1[-1]);                          /* { dg-warning "array subscript -1 is below array bounds" } */
     139    T (p->a1[0]);
     140    T (p->a1[9]);
     141    T (p->a1[DIFF_MAX - offsetof (A1, a1) - 1]);
     142    T (p->a1[DIFF_MAX - offsetof (A1, a1)]);/* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     143    T (p->a1[DIFF_MAX - offsetof (A1, a1) + 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     144    T (p->a1[SIZE_MAX]);                    /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     145  }
     146  
     147  void fb (struct B *p)
     148  {
     149    T (p->a1x->a1[DIFF_MIN]);               /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
     150    T (p->a1x->a1[-1]);                     /* { dg-warning "array subscript -1 is below array bounds" } */
     151    T (p->a1x->a1[0]);
     152    T (p->a1x->a1[9]);                      /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     153    T (p->a1x->a1[DIFF_MAX - sizeof *p]);   /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     154    T (p->a1x->a1[DIFF_MAX - sizeof *p + 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     155    T (p->a1x->a1[SIZE_MAX]);               /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     156  
     157    T (p->a1x[1].a1[DIFF_MIN]);             /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
     158    T (p->a1x[1].a1[-1]);                   /* { dg-warning "array subscript -1 is below array bounds" } */
     159    T (p->a1x[1].a1[0]);
     160    T (p->a1x[1].a1[9]);                    /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     161    T (p->a1x[1].a1[DIFF_MAX - sizeof *p]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     162    T (p->a1x[1].a1[DIFF_MAX - sizeof *p + 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     163    T (p->a1x[1].a1[SIZE_MAX]);             /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     164  
     165    T (p->a1x[2].a1[DIFF_MIN]);             /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
     166    T (p->a1x[2].a1[-1]);                   /* { dg-warning "array subscript -1 is below array bounds" } */
     167    T (p->a1x[2].a1[0]);
     168    T (p->a1x[2].a1[9]);                    /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     169    T (p->a1x[2].a1[DIFF_MAX - sizeof *p]);/* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     170    T (p->a1x[2].a1[DIFF_MAX - sizeof *p + 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     171    T (p->a1x[2].a1[SIZE_MAX]);             /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     172  
     173    T (p->a1x[3].a1[DIFF_MIN]);             /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
     174    T (p->a1x[3].a1[-1]);                   /* { dg-warning "array subscript -1 is below array bounds" } */
     175    T (p->a1x[3].a1[0]);
     176    T (p->a1x[3].a1[9]);                    /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     177  
     178    T (p->a1x[9].a1[0]);
     179  
     180    enum { MAX = (DIFF_MAX - sizeof *p) / sizeof *p->a1x };
     181  
     182    T (p->a1x[DIFF_MIN].a1);                /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
     183    T (p->a1x[-1].a1);                      /* { dg-warning "array subscript -1 is below array bounds" } */
     184    T (p->a1x[MAX].a1);
     185    T (p->a1x[MAX + 2].a1);                 /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     186  
     187    T (p->a1x[DIFF_MAX].a1);                /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     188    T (p->a1x[SIZE_MAX].a1);                /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     189  
     190    T (p->a1x[DIFF_MIN].a1[0]);             /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
     191    T (p->a1x[-1].a1[0])                    /* { dg-warning "array subscript -1 is below array bounds" } */;
     192    T (p->a1x[MAX - 1].a1[0]);
     193    T (p->a1x[MAX].a1[0]);                  /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     194    T (p->a1x[MAX + 1].a1[0]);              /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     195  
     196    T (p->a1x[DIFF_MAX].a1[0]);             /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     197    T (p->a1x[SIZE_MAX].a1[0]);             /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
     198  }
     199  
     200  void f_cststring (int i)
     201  {
     202    T (""[DIFF_MIN]);                       /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(const )?char *\\\[1]" "string" { xfail { lp64 || llp64 } } } */
     203    T (""[DIFF_MIN + 1]);                   /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(const )?char *\\\[1]" "string" } */
     204    T (""[-1]);                             /* { dg-warning "array subscript -1 is below array bounds of .(const )?char *\\\[1]" "string" } */
     205    T (""[0]);
     206    T (""[1]);                              /* { dg-warning "array subscript 1 is above array bounds of .(const )?char *\\\[1]" "string" } */
     207    T ("0"[2]);                             /* { dg-warning "array subscript 2 is above array bounds of .(const )?char *\\\[2]" "string" } */
     208    T ("012"[2]);
     209    T ("012"[3]);
     210    T ("012"[4]);                           /* { dg-warning "array subscript 4 is above array bounds of .(const )?char *\\\[4]" "string" } */
     211    T ("0123"[DIFF_MAX]);                   /* { dg-warning "array subscript \[0-9\]+ is above array bounds of .(const )?char *\\\[5]" "string" } */
     212    T ("0123"[SIZE_MAX]);                   /* { dg-warning "array subscript \[0-9\]+ is above array bounds of .(const )?char *\\\[5]" "string" } */
     213  }
     214  
     215  void fb_strlen (struct B *p)
     216  {
     217  #define strlen __builtin_strlen
     218  
     219    T (strlen (&p->a1x[0].a1[2]));          /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "strlen" } */
     220    T (strlen (p->a1x[0].a1 + 2));          /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "strlen" { xfail *-*-* } } */
     221  }
     222  
     223  
     224  void f_vla (unsigned n)
     225  {
     226    char vla[n];
     227  
     228    T (vla[DIFF_MIN]);                      /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" "vla" } */
     229    T (vla[-1]);                            /* { dg-warning "array subscript -1 is below array bounds" "vla" } */
     230    T (vla[0]);
     231    T (vla[1]);
     232    T (vla[n - 1]);
     233    /* It would be nice to diagnose this. */
     234    T (vla[n]);                             /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "bug 82608" { xfail *-*-*} } */
     235    T (vla[DIFF_MAX]);                      /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "vla" } */
     236  }