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

            Bug ID: 91914
           Summary: Invalid strlen optimization
           Product: gcc
           Version: 8.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: joerg.rich...@pdv-fs.de
  Target Milestone: ---

cat > t.c <<EOF
#include <stdio.h>
#include <string.h>

struct stringpool_t
{
    char stringpool_str4[sizeof("Foo")];
    char stringpool_str5[sizeof("Bar")];
};

static const struct stringpool_t stringpool_contents = {
  "Foo",
  "Bar",
};

#define stringpool ((const char *) &stringpool_contents)

int main( int argc, char** argv )
{
  printf( "%zu\n", strlen( stringpool + 4 ) );
  volatile int idx = 4;
  printf( "%zu\n", strlen( stringpool + idx ) );
  return 0;
}
EOF

gcc -o t t.c -Wall

## Output:
3
0

The first strlen() has the warning "offset '4' outside bounds 
of constant string [-Warray-bounds]".  I think this is a wrong 
warning, because of the cast to char*. But the strlen() result is okay.

The second strlen() returns 0.  This is more serious as this results in wrong
code.

The stringpool-code is generated by gperf.

Reply via email to