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

            Bug ID: 95988
           Summary: [10/11 Regression] Bogus
                    -Warray-bounds/-Wstringop-overflow warning  with loop
           Product: gcc
           Version: 10.0
            Status: NEW
          Keywords: diagnostic
          Severity: normal
          Priority: P2
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
                CC: msebor at gcc dot gnu.org
        Depends on: 94655
  Target Milestone: 10.2
  Target Milestone: 10.2
                CC: msebor at gcc dot gnu.org
  Last reconfirmed: 2020-06-30
            Status: NEW
          Priority: P2
    Ever confirmed: 1
        Depends on: 94655

Compile with -O2 -W -Wall:

void f(int*);
void g(int*);
struct  sched_group_t {
  int lock;
  struct {
   char name[32 + 1];
   int aa;
  } group[(3 + 9)];
} ;
struct sched_global_t {
 char t[(3 + 9)][3];
 struct sched_group_t sched_group;
};

struct sched_global_t *sched_global;

int hh(const char *name)
{
 struct sched_group_t *sched_group = &sched_global->sched_group;
 int i;

 g(&sched_group->lock);

 for (i = 3; i < (3 + 9); i++) {
  if (!sched_group->group[i].aa) 
  {
   char *grp_name = sched_group->group[i].name;
    __builtin_strncpy(grp_name, name, 32 - 1);
    grp_name[32 - 1] = 0;
   break;
  }
 }
 f(&sched_group->lock);
 return 0;
}

--- CUT ---
t.c: In function ‘hh’:
t.c:28:5: warning: ‘__builtin_strncpy’ offset [124, 484] is out of the bounds
[0, 4] [-Warray-bounds]
   28 |     __builtin_strncpy(grp_name, name, 32 - 1);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
t.c:29:22: warning: writing 1 byte into a region of size 0
[-Wstringop-overflow=]
   29 |     grp_name[32 - 1] = 0;
      |     ~~~~~~~~~~~~~~~~~^~~
t.c:4:7: note: at offset 155 to object ‘lock’ with size 4 declared here
    4 |   int lock;
      |       ^~~~

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
The problem is related to &sched_global->sched_group and
&sched_global->sched_group->lock are at the same location, so GCC seems to
select the MEM for &sched_global->sched_group->lock for both. THIS is just a
diagnostic issue of the warning.

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Note unlike other -Warray-bounds/-Wstringop-overflow warnings, there is no
flexiable array in effect here.  Rather it is due to using the offset for
sched_global->sched_group and sched_global->sched_group.lock issue.

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I should mention this was reduced from upstream ODP
(https://opendataplane.org/) Linux generic version.

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I think this is related to PR 94655.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94655
[Bug 94655] [10/11 Regression] Implicit assignment operator triggers
stringop-overflow warning since r10-5451-gef29b12cfbb4979a

Reply via email to