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

            Bug ID: 93829
           Summary: [10 Regression] bogus -Wstringop-overflow on memcpy of
                    a struct with a pointer member from another with a
                    long string
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

The following test case reduced from RHBZ #1800289 shows a spurious
-Wstringop-overflow issued for the memcpy call.  The warning misinterprets the
second MEM_REF involving the string as a store of the string itself into the
allocated object (as opposed to the store of its address into the char*
member).

$ cat rhbz-1800289.c && gcc -O2 -S -Wall -Wextra -fdump-tree-strlen=/dev/stdout
rhbz-1800289.c
struct S
{
  void *p, *q, *r;
} a;

void create_command_list (void)
{
  struct S b = { 0, "Enable all debug messages", 0 };

  __builtin_memcpy (&a, &b, sizeof b);
}

;; Function create_command_list (create_command_list, funcdef_no=0,
decl_uid=1935, cgraph_uid=1, symbol_order=1)

;; 1 loops found
;;
;; Loop 0
;;  header 0, latch 1
;;  depth 0, outer -1
;;  nodes: 0 1 2
;; 2 succs { 1 }
rhbz-1800289.c: In function ‘create_command_list’:
rhbz-1800289.c:10:3: warning: writing 26 bytes into a region of size 16
[-Wstringop-overflow=]
   10 |   __builtin_memcpy (&a, &b, sizeof b);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rhbz-1800289.c:4:3: note: at offset 8 to object ‘a’ with size 24 declared here
    4 | } a;
      |   ^
create_command_list ()
{
  <bb 2> [local count: 1073741824]:
  MEM <void *> [(char * {ref-all})&a] = 0B;
  MEM <void *> [(char * {ref-all})&a + 8B] = "Enable all debug messages";
  MEM <void *> [(char * {ref-all})&a + 16B] = 0B;
  return;

}

Reply via email to