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