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

            Bug ID: 118817
           Summary: stringop-overflow and array-bound error with LTO/O3
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: shahzad.malik.muzaffar at cern dot ch
  Target Milestone: ---

Hi,
  We are trying to build our software stack with GCC 14.2.1 [a] and are getting
stringop-overflow and array-bound error [b] when build with LTO. A simple code
to reproduce is in [c] below. The build/compilation command is in [d]. If I
drop the LTO flags OR use "-O2" with lto flags then comiler does not complain.

  Is this a know issue?

Regards,
--Shahzad


[a]
[muzaffar@cmsdev42 src]$ c++ --version
c++ (GCC) 14.2.1 20250130
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


[b]
In function 'assign',
    inlined from '_M_set_length' at
gcc/include/c++/14.2.1/bits/basic_string.h:262:21,
    inlined from '_M_construct' at
gcc/include/c++/14.2.1/bits/basic_string.tcc:251:15,
    inlined from '__ct ' at gcc/include/c++/14.2.1/bits/basic_string.h:654:14,
    inlined from 'construct_at' at
gcc/include/c++/14.2.1/bits/stl_construct.h:97:14,
    inlined from 'construct' at
gcc/include/c++/14.2.1/bits/alloc_traits.h:577:21,
    inlined from 'emplace_back' at
gcc/include/c++/14.2.1/bits/vector.tcc:117:30,
    inlined from 'func' at test.cc:9:23:
gcc/include/c++/14.2.1/bits/char_traits.h:350:14: warning: writing 1 byte into
a region of size 0 [-Wstringop-overflow=]
  350 |         __c1 = __c2;
      |              ^
In member function 'allocate',
    inlined from 'allocate' at gcc/include/c++/14.2.1/bits/allocator.h:196:40,
    inlined from 'allocate' at
gcc/include/c++/14.2.1/bits/alloc_traits.h:515:28,
    inlined from '_M_allocate' at
gcc/include/c++/14.2.1/bits/stl_vector.h:380:33,
    inlined from '_M_realloc_append' at
gcc/include/c++/14.2.1/bits/vector.tcc:596:44,
    inlined from 'emplace_back' at
gcc/include/c++/14.2.1/bits/vector.tcc:123:21,
    inlined from 'func' at test.cc:8:23:
gcc/include/c++/14.2.1/bits/new_allocator.h:151:55: note: at offset 85 into
destination object of size 64 allocated by 'operator new'
  151 |         return static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__n *
sizeof(_Tp)));
      |                                                       ^
In function 'copy',
    inlined from '_S_copy' at
gcc/include/c++/14.2.1/bits/basic_string.h:435:21,
    inlined from '_S_copy_chars' at
gcc/include/c++/14.2.1/bits/basic_string.h:489:16,
    inlined from '_M_construct' at
gcc/include/c++/14.2.1/bits/basic_string.tcc:247:21,
    inlined from '__ct ' at gcc/include/c++/14.2.1/bits/basic_string.h:654:14,
    inlined from 'construct_at' at
gcc/include/c++/14.2.1/bits/stl_construct.h:97:14,
    inlined from 'construct' at
gcc/include/c++/14.2.1/bits/alloc_traits.h:577:21,
    inlined from 'emplace_back' at
gcc/include/c++/14.2.1/bits/vector.tcc:117:30,
    inlined from 'func' at test.cc:9:23:
gcc/include/c++/14.2.1/bits/char_traits.h:427:56: error: '__builtin_memcpy'
offset 80 is out of the bounds [0, 64] [-Werror=array-bounds=]
  427 |         return static_cast<char_type*>(__builtin_memcpy(__s1, __s2,
__n));


[c]
#include <memory>
#include <vector>
#include <string>

int func() {
  auto strVec = std::make_unique<std::vector<std::string>>();
  strVec->emplace_back("One");
  strVec->emplace_back("Two");
  strVec->emplace_back("Three");
  return 0;
}


[b]

c++ -c -DGNU_GCC -D_GNU_SOURCE -O3 -pthread -pipe -Werror=main
-Werror=pointer-arith -Werror=overlength-strings -Wno-vla -Werror=overflow
-std=c++20 -ftree-vectorize -Werror=array-bounds -Werror=format-contains-nul
-Werror=type-limits -fvisibility-inlines-hidden -fno-math-errno --param
vect-max-version-for-alias-checks=50 -Xassembler --compress-debug-sections
-fuse-ld=bfd -march=x86-64-v3 -felide-constructors -fmessage-length=0 -Wall
-Wno-non-template-friend -Wno-long-long -Wreturn-type -Wextra
-Wpessimizing-move -Wclass-memaccess -Wno-cast-function-type
-Wno-unused-but-set-parameter -Wno-ignored-qualifiers -Wno-unused-parameter
-Wunused -Wparentheses -Werror=return-type -Werror=missing-braces
-Werror=unused-value -Werror=unused-label -Werror=address -Werror=format
-Werror=sign-compare -Werror=write-strings -Werror=delete-non-virtual-dtor
-Werror=strict-aliasing -Werror=narrowing -Werror=unused-but-set-variable
-Werror=reorder -Werror=unused-variable -Werror=conversion-null
-Werror=return-local-addr -Wnon-virtual-dtor -Werror=switch
-fdiagnostics-show-option -Wno-unused-local-typedefs -Wno-attributes -Wno-psabi
-flto=auto -fipa-icf -flto-odr-type-merging -fno-fat-lto-objects -Wodr -fPIC
test.cc -o test.cc.o


c++ -O3 -pthread -pipe -Werror=main -Werror=pointer-arith
-Werror=overlength-strings -Wno-vla -Werror=overflow -std=c++20
-ftree-vectorize -Werror=array-bounds -Werror=format-contains-nul
-Werror=type-limits -fvisibility-inlines-hidden -fno-math-errno --param
vect-max-version-for-alias-checks=50 -Xassembler --compress-debug-sections
-fuse-ld=bfd -march=x86-64-v3 -felide-constructors -fmessage-length=0 -Wall
-Wno-non-template-friend -Wno-long-long -Wreturn-type -Wextra
-Wpessimizing-move -Wclass-memaccess -Wno-cast-function-type
-Wno-unused-but-set-parameter -Wno-ignored-qualifiers -Wno-unused-parameter
-Wunused -Wparentheses -Werror=return-type -Werror=missing-braces
-Werror=unused-value -Werror=unused-label -Werror=address -Werror=format
-Werror=sign-compare -Werror=write-strings -Werror=delete-non-virtual-dtor
-Werror=strict-aliasing -Werror=narrowing -Werror=unused-but-set-variable
-Werror=reorder -Werror=unused-variable -Werror=conversion-null
-Werror=return-local-addr -Wnon-virtual-dtor -Werror=switch
-fdiagnostics-show-option -Wno-unused-local-typedefs -Wno-attributes -Wno-psabi
-flto=auto -fipa-icf -flto-odr-type-merging -fno-fat-lto-objects -Wodr -shared
-Wl,-E    -Wl,-z,defs  test.cc.o -o libxy.so -Wl,-E -Wl,--hash-style=gnu
-Wl,--as-needed -Wl,-z,noexecstack

Reply via email to