https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86622

            Bug ID: 86622
           Summary: incorrect strlen of array of array plus variable
                    offset
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

As discussed in https://gcc.gnu.org/ml/gcc-patches/2018-07/msg01215.html, GCC
emits incorrect code for the following test case:

$ cat c.c && gcc c.c && ./a.out

static const char a[3][8] = { "1234", "12345", "123456" };

int main ()
{
   volatile int i = 1;
   int n = __builtin_strlen (*(&a[1] + i));

   if (n != 6)
     __builtin_abort ();
}
Aborted (core dumped)

The root cause is the handling of POINTER_PLUS expressions in
string_constant().  The original code (before the handling of aggregates was
added in r262522) just dealt with string constants.  The new code does much
more but doesn't get this case right in these cases.

Reply via email to