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