https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124267
Bug ID: 124267
Summary: False positive -Wrestrict with std::string::operator+
with -O3
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: carlosgalvezp at gmail dot com
Target Milestone: ---
Hi!
We are bumping our GCC build from 18c32a391685256d2fbd6e3e6b2f7f93200bb912 to
716ec14c573c7ec9e3732e66c7288db8f0348154 and now encounter this seemingly false
positive:
#include <string>
struct Foo;
void bar(const Foo&);
std::string update(std::string);
Foo const& getFoo(std::string const&);
void foo() {
std::string x = "foooooooooooooooooooooooooo";
x = update(x);
for (int i = 0U; i < 64; i++) {
bar(getFoo(x + "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar" +
std::to_string(i)));
bar(getFoo(x + "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar" +
std::to_string(i)));
}
}
g++ -O3 -Wall -std=c++17 -D_GLIBCXX_ASSERTIONS -Werror test.cpp
n file included from
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/string:45,
from <source>:1:
In static member function 'static std::char_traits<char>::char_type*
std::char_traits<char>::copy(char_type*, const char_type*, std::size_t)',
inlined from 'static void std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::_S_copy(_CharT*, const _CharT*, size_type) [with _CharT = char;
_Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' at
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/basic_string.h:458:21,
inlined from 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_append(const _CharT*,
size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc =
std::allocator<char>]' at
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/basic_string.tcc:484:19,
inlined from 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*,
size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc =
std::allocator<char>]' at
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/basic_string.h:1595:18,
inlined from '_Str std::__str_concat(const typename _Str::value_type*,
typename _Str::size_type, const typename _Str::value_type*, typename
_Str::size_type, const typename _Str::allocator_type&) [with _Str =
__cxx11::basic_string<char>]' at
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/basic_string.h:3879:19,
inlined from 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>
std::operator+(const __cxx11::basic_string<_CharT, _Traits, _Alloc>&, const
_CharT*) [with _CharT = char; _Traits = char_traits<char>; _Alloc =
allocator<char>]' at
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/basic_string.h:3955:31,
inlined from 'void foo()' at <source>:14:24:
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/char_traits.h:432:56:
error: 'void* __builtin_memcpy(void*, const void*, long unsigned int)'
accessing 18446744073709551581 or more bytes at offsets 0 and 0 overlaps
9223372036854775739 bytes at offset -9223372036854775774 [-Werror=restrict]
432 | return static_cast<char_type*>(__builtin_memcpy(__s1, __s2,
__n));
|
~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
In static member function 'static std::char_traits<char>::char_type*
std::char_traits<char>::copy(char_type*, const char_type*, std::size_t)',
inlined from 'static void std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::_S_copy(_CharT*, const _CharT*, size_type) [with _CharT = char;
_Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' at
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/basic_string.h:458:21,
inlined from 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_append(const _CharT*,
size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc =
std::allocator<char>]' at
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/basic_string.tcc:484:19,
inlined from 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*,
size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc =
std::allocator<char>]' at
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/basic_string.h:1595:18,
inlined from '_Str std::__str_concat(const typename _Str::value_type*,
typename _Str::size_type, const typename _Str::value_type*, typename
_Str::size_type, const typename _Str::allocator_type&) [with _Str =
__cxx11::basic_string<char>]' at
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/basic_string.h:3879:19,
inlined from 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>
std::operator+(const __cxx11::basic_string<_CharT, _Traits, _Alloc>&, const
_CharT*) [with _CharT = char; _Traits = char_traits<char>; _Alloc =
allocator<char>]' at
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/basic_string.h:3955:31,
inlined from 'void foo()' at <source>:16:24:
/cefs/5b/5b7473000a337cbbdec6c161_gcc-trunk-20260226/include/c++/16.0.1/bits/char_traits.h:432:56:
error: 'void* __builtin_memcpy(void*, const void*, long unsigned int)'
accessing 18446744073709551581 or more bytes at offsets 0 and 0 overlaps
9223372036854775739 bytes at offset -9223372036854775774 [-Werror=restrict]
432 | return static_cast<char_type*>(__builtin_memcpy(__s1, __s2,
__n));
|
~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
https://godbolt.org/z/PKWejKWTn
The warning goes away making the string literals smaller, reducing the amount
of iterations in the loop, removing the GLIBCXX assertions or the -std=c++17
flag. It sounds related to optimization since it's only active at -O3.