(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Warray-bounds-58.c
       1  /* { dg-do compile }
       2     { dg-options "-O2 -Wall -Wno-stringop-overread" } */
       3  
       4  typedef __SIZE_TYPE__ size_t;
       5  
       6  extern size_t strlen (const char*);
       7  
       8  void sink (size_t);
       9  
      10  struct A0 { char i, a[0]; };
      11  
      12  extern struct A0 ea0;
      13  
      14  void fa0_extern (void)
      15  {
      16    sink (strlen (ea0.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
      17    sink (strlen (ea0.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
      18    sink (strlen (ea0.a));        // valid just-past-the-end offset
      19    sink (strlen (ea0.a + 1));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
      20  }
      21  
      22  static struct A0 sa0 = { 0 };
      23  
      24  void fa0_static (void)
      25  {
      26    sink (strlen (sa0.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
      27    sink (strlen (sa0.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
      28    sink (strlen (sa0.a));        // valid just-past-the-end offset
      29    sink (strlen (sa0.a + 1));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
      30  }
      31  
      32  
      33  struct Ax { char i, a[]; };
      34  
      35  extern struct Ax ax;
      36  
      37  void fax_extern (void)
      38  {
      39    sink (strlen (ax.a - 2));     // { dg-warning "\\\[-Warray-bounds" "pr93514" }
      40    sink (strlen (ax.a - 1));     // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
      41    sink (strlen (ax.a));
      42    sink (strlen (ax.a + 123));
      43  }
      44  
      45  static struct Ax ax0 = { 0, { 0 } };
      46  static struct Ax ax1 = { 1, { 1, 0 } };
      47  static struct Ax ax2 = { 2, { 2, 1, 0 } };
      48  static struct Ax ax3 = { 3, { 3, 2, 1, 0 } };
      49  
      50  void fax_static (void)
      51  {
      52    sink (strlen (ax0.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
      53    sink (strlen (ax0.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
      54    sink (strlen (ax0.a));
      55    sink (strlen (ax0.a + 1));    // valid just-past-the-end offset
      56    sink (strlen (ax0.a + 2));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
      57  
      58    sink (strlen (ax1.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
      59    sink (strlen (ax1.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
      60    sink (strlen (ax1.a));
      61    sink (strlen (ax1.a + 1));
      62    sink (strlen (ax1.a + 2));    // valid just-past-the-end offset
      63    sink (strlen (ax1.a + 3));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
      64  
      65    sink (strlen (ax2.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
      66    sink (strlen (ax2.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
      67    sink (strlen (ax2.a));
      68    sink (strlen (ax2.a + 1));
      69    sink (strlen (ax2.a + 2));
      70    sink (strlen (ax2.a + 3));    // valid just-past-the-end offset
      71    sink (strlen (ax2.a + 4));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
      72  
      73    sink (strlen (ax3.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
      74    sink (strlen (ax3.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
      75    sink (strlen (ax3.a));
      76    sink (strlen (ax3.a + 1));
      77    sink (strlen (ax3.a + 2));
      78    sink (strlen (ax3.a + 3));
      79    sink (strlen (ax3.a + 4));    // valid just-past-the-end offset
      80    sink (strlen (ax3.a + 5));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
      81  }