https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104966
Bug ID: 104966
Summary: [11/12 Regression] Yet another bogus -Warray-bounds
warning in libstdc++ headers
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Keywords: diagnostic
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Blocks: 56456
Target Milestone: ---
This has been failing for a while, but since there seems little chance of it
getting fixed I didn't bother reporting it.
This can be seen on any target with:
make check RUNTESTFLAGS="conformance.exp=22_locale/money_get/cons/3.cc
--target_board=unix/-std=gnu++20"
Executing on host: /home/jwakely/build/./gcc/xg++ -shared-libgcc
-B/home/jwakely/build/./gcc -nostdinc++
-L/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/src
-L/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/src/.libs
-L/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/libsupc++/.libs
-B/home/jwakely/gcc/12/powerpc64le-unknown-linux-gnu/bin/
-B/home/jwakely/gcc/12/powerpc64le-unknown-linux-gnu/lib/ -isystem
/home/jwakely/gcc/12/powerpc64le-unknown-linux-gnu/include -isystem
/home/jwakely/gcc/12/powerpc64le-unknown-linux-gnu/sys-include
-B/home/jwakely/build/powerpc64le-unknown-linux-gnu/./libstdc++-v3/src/.libs
-fmessage-length=0 -fno-show-column -ffunction-sections -fdata-sections -g -O2
-D_GNU_SOURCE -DLOCALEDIR="." -nostdinc++
-I/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/powerpc64le-unknown-linux-gnu
-I/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include
-I/home/jwakely/src/gcc/libstdc++-v3/libsupc++
-I/home/jwakely/src/gcc/libstdc++-v3/include/backward
-I/home/jwakely/src/gcc/libstdc++-v3/testsuite/util
/home/jwakely/src/gcc/libstdc++-v3/testsuite/22_locale/money_get/cons/3.cc
-std=gnu++20 -fdiagnostics-plain-output -S -o 3.s (timeout = 90)
spawn -ignore SIGHUP /home/jwakely/build/./gcc/xg++ -shared-libgcc
-B/home/jwakely/build/./gcc -nostdinc++
-L/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/src
-L/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/src/.libs
-L/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/libsupc++/.libs
-B/home/jwakely/gcc/12/powerpc64le-unknown-linux-gnu/bin/
-B/home/jwakely/gcc/12/powerpc64le-unknown-linux-gnu/lib/ -isystem
/home/jwakely/gcc/12/powerpc64le-unknown-linux-gnu/include -isystem
/home/jwakely/gcc/12/powerpc64le-unknown-linux-gnu/sys-include
-B/home/jwakely/build/powerpc64le-unknown-linux-gnu/./libstdc++-v3/src/.libs
-fmessage-length=0 -fno-show-column -ffunction-sections -fdata-sections -g -O2
-D_GNU_SOURCE -DLOCALEDIR="." -nostdinc++
-I/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/powerpc64le-unknown-linux-gnu
-I/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include
-I/home/jwakely/src/gcc/libstdc++-v3/libsupc++
-I/home/jwakely/src/gcc/libstdc++-v3/include/backward
-I/home/jwakely/src/gcc/libstdc++-v3/testsuite/util
/home/jwakely/src/gcc/libstdc++-v3/testsuite/22_locale/money_get/cons/3.cc
-std=gnu++20 -fdiagnostics-plain-output -S -o 3.s
In file included from
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/string:50,
from
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/locale_classes.h:40,
from
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/locale:39,
from
/home/jwakely/src/gcc/libstdc++-v3/testsuite/22_locale/money_get/cons/3.cc:24:
In static member function 'static constexpr _Tp* std::__copy_move<_IsMove,
true, std::random_access_iterator_tag>::__copy_m(const _Tp*, const _Tp*, _Tp*)
[with _Tp = __gnu_cxx::character<unsigned int, long unsigned int>; bool _IsMove
= false]',
inlined from 'constexpr _OI std::__copy_move_a2(_II, _II, _OI) [with bool
_IsMove = false; _II = const __gnu_cxx::character<unsigned int, long unsigned
int>*; _OI = __gnu_cxx::character<unsigned int, long unsigned int>*]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:495,
inlined from 'constexpr _OI std::__copy_move_a1(_II, _II, _OI) [with bool
_IsMove = false; _II = const __gnu_cxx::character<unsigned int, long unsigned
int>*; _OI = __gnu_cxx::character<unsigned int, long unsigned int>*]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:522,
inlined from 'constexpr _OI std::__copy_move_a(_II, _II, _OI) [with bool
_IsMove = false; _II = const __gnu_cxx::character<unsigned int, long unsigned
int>*; _OI = __gnu_cxx::character<unsigned int, long unsigned int>*]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:529,
inlined from 'constexpr _OI std::copy(_II, _II, _OI) [with _II = const
__gnu_cxx::character<unsigned int, long unsigned int>*; _OI =
__gnu_cxx::character<unsigned int, long unsigned int>*]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:620,
inlined from 'static std::char_traits<__gnu_cxx::character<_Value, _Int,
_St> >::char_type* std::char_traits<__gnu_cxx::character<_Value, _Int, _St>
>::copy(char_type*, const char_type*, std::size_t) [with _Value = unsigned int;
_Int = long unsigned int; _St = __mbstate_t]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/ext/pod_char_traits.h:158,
inlined from 'static std::char_traits<__gnu_cxx::character<_Value, _Int,
_St> >::char_type* std::char_traits<__gnu_cxx::character<_Value, _Int, _St>
>::copy(char_type*, const char_type*, std::size_t) [with _Value = unsigned int;
_Int = long unsigned int; _St = __mbstate_t]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/ext/pod_char_traits.h:154,
inlined from 'static constexpr void std::__cxx11::basic_string<_CharT,
_Traits, _Alloc>::_S_copy(_CharT*, const _CharT*, size_type) [with _CharT =
__gnu_cxx::character<unsigned int, long unsigned int>; _Traits =
std::char_traits<__gnu_cxx::character<unsigned int, long unsigned int> >;
_Alloc = std::allocator<__gnu_cxx::character<unsigned int, long unsigned int>
>]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.h:423,
inlined from 'static constexpr void std::__cxx11::basic_string<_CharT,
_Traits, _Alloc>::_S_copy(_CharT*, const _CharT*, size_type) [with _CharT =
__gnu_cxx::character<unsigned int, long unsigned int>; _Traits =
std::char_traits<__gnu_cxx::character<unsigned int, long unsigned int> >;
_Alloc = std::allocator<__gnu_cxx::character<unsigned int, long unsigned int>
>]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.h:418,
inlined from 'constexpr std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::size_type std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::copy(_CharT*, size_type, size_type) const [with _CharT =
__gnu_cxx::character<unsigned int, long unsigned int>; _Traits =
std::char_traits<__gnu_cxx::character<unsigned int, long unsigned int> >;
_Alloc = std::allocator<__gnu_cxx::character<unsigned int, long unsigned int>
>]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:555,
inlined from 'void std::__moneypunct_cache<_CharT, _Intl>::_M_cache(const
std::locale&) [with _CharT = __gnu_cxx::character<unsigned int, long unsigned
int>; bool _Intl = false]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets_nonio.tcc:101:
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:431:
warning: 'void* __builtin_memmove(void*, const void*, long unsigned int)'
writing 1 or more bytes into a region of size 0 overflows the destination
[-Wstringop-overflow=]
In file included from
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets_nonio.h:2069,
from
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/locale:41:
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets_nonio.tcc:
In member function 'void std::__moneypunct_cache<_CharT, _Intl>::_M_cache(const
std::locale&) [with _CharT = __gnu_cxx::character<unsigned int, long unsigned
int>; bool _Intl = false]':
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets_nonio.tcc:100:
note: destination object of size 0 allocated by 'operator new []'
In static member function 'static constexpr _Tp* std::__copy_move<_IsMove,
true, std::random_access_iterator_tag>::__copy_m(const _Tp*, const _Tp*, _Tp*)
[with _Tp = __gnu_cxx::character<unsigned int, long unsigned int>; bool _IsMove
= false]',
inlined from 'constexpr _OI std::__copy_move_a2(_II, _II, _OI) [with bool
_IsMove = false; _II = const __gnu_cxx::character<unsigned int, long unsigned
int>*; _OI = __gnu_cxx::character<unsigned int, long unsigned int>*]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:495,
inlined from 'constexpr _OI std::__copy_move_a1(_II, _II, _OI) [with bool
_IsMove = false; _II = const __gnu_cxx::character<unsigned int, long unsigned
int>*; _OI = __gnu_cxx::character<unsigned int, long unsigned int>*]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:522,
inlined from 'constexpr _OI std::__copy_move_a(_II, _II, _OI) [with bool
_IsMove = false; _II = const __gnu_cxx::character<unsigned int, long unsigned
int>*; _OI = __gnu_cxx::character<unsigned int, long unsigned int>*]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:529,
inlined from 'constexpr _OI std::copy(_II, _II, _OI) [with _II = const
__gnu_cxx::character<unsigned int, long unsigned int>*; _OI =
__gnu_cxx::character<unsigned int, long unsigned int>*]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:620,
inlined from 'static std::char_traits<__gnu_cxx::character<_Value, _Int,
_St> >::char_type* std::char_traits<__gnu_cxx::character<_Value, _Int, _St>
>::copy(char_type*, const char_type*, std::size_t) [with _Value = unsigned int;
_Int = long unsigned int; _St = __mbstate_t]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/ext/pod_char_traits.h:158,
inlined from 'static std::char_traits<__gnu_cxx::character<_Value, _Int,
_St> >::char_type* std::char_traits<__gnu_cxx::character<_Value, _Int, _St>
>::copy(char_type*, const char_type*, std::size_t) [with _Value = unsigned int;
_Int = long unsigned int; _St = __mbstate_t]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/ext/pod_char_traits.h:154,
inlined from 'static constexpr void std::__cxx11::basic_string<_CharT,
_Traits, _Alloc>::_S_copy(_CharT*, const _CharT*, size_type) [with _CharT =
__gnu_cxx::character<unsigned int, long unsigned int>; _Traits =
std::char_traits<__gnu_cxx::character<unsigned int, long unsigned int> >;
_Alloc = std::allocator<__gnu_cxx::character<unsigned int, long unsigned int>
>]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.h:423,
inlined from 'static constexpr void std::__cxx11::basic_string<_CharT,
_Traits, _Alloc>::_S_copy(_CharT*, const _CharT*, size_type) [with _CharT =
__gnu_cxx::character<unsigned int, long unsigned int>; _Traits =
std::char_traits<__gnu_cxx::character<unsigned int, long unsigned int> >;
_Alloc = std::allocator<__gnu_cxx::character<unsigned int, long unsigned int>
>]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.h:418,
inlined from 'constexpr std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::size_type std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::copy(_CharT*, size_type, size_type) const [with _CharT =
__gnu_cxx::character<unsigned int, long unsigned int>; _Traits =
std::char_traits<__gnu_cxx::character<unsigned int, long unsigned int> >;
_Alloc = std::allocator<__gnu_cxx::character<unsigned int, long unsigned int>
>]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:555,
inlined from 'void std::__moneypunct_cache<_CharT, _Intl>::_M_cache(const
std::locale&) [with _CharT = __gnu_cxx::character<unsigned int, long unsigned
int>; bool _Intl = false]' at
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets_nonio.tcc:106:
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:431:
warning: 'void* __builtin_memmove(void*, const void*, long unsigned int)'
writing 1 or more bytes into a region of size 0 overflows the destination
[-Wstringop-overflow=]
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets_nonio.tcc:
In member function 'void std::__moneypunct_cache<_CharT, _Intl>::_M_cache(const
std::locale&) [with _CharT = __gnu_cxx::character<unsigned int, long unsigned
int>; bool _Intl = false]':
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets_nonio.tcc:105:
note: destination object of size 0 allocated by 'operator new []'
FAIL: 22_locale/money_get/cons/3.cc (test for excess errors)
Excess errors:
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:431:
warning: 'void* __builtin_memmove(void*, const void*, long unsigned int)'
writing 1 or more bytes into a region of size 0 overflows the destination
[-Wstringop-overflow=]
/home/jwakely/build/powerpc64le-unknown-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:431:
warning: 'void* __builtin_memmove(void*, const void*, long unsigned int)'
writing 1 or more bytes into a region of size 0 overflows the destination
[-Wstringop-overflow=]
The code allocates an array of n bytes and copies n bytes into it. If n==0 it
copies 0 bytes. There's no overflow.
const basic_string<_CharT>& __ns = __mp.negative_sign();
_M_negative_sign_size = __ns.size();
__negative_sign = new _CharT[_M_negative_sign_size];
__ns.copy(__negative_sign, _M_negative_sign_size);
If you use -std=gnu++20 -Wall there are more bogus warnings:
/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/libstdc++-v3/include/ext/pod_char_traits.h:107:
warning: array subscript 0 is outside array bounds of
'__gnu_cxx::character<unsigned int, long unsigned int> [0]' [-Warray-bounds]
/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/libstdc++-v3/include/ext/pod_char_traits.h:107:
warning: array subscript 0 is outside array bounds of
'__gnu_cxx::character<unsigned int, long unsigned int> [0]' [-Warray-bounds]
/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:431:
warning: 'void* __builtin_memmove(void*, const void*, long unsigned int)'
offset 0 is out of the bounds [0, 0] [-Warray-bounds]
/home/jwakely/src/gcc/build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:431:
warning: 'void* __builtin_memmove(void*, const void*, long unsigned int)'
offset 0 is out of the bounds [0, 0] [-Warray-bounds]
I don't know why they're given twice but the "array subscript is outside array
bounds" ones are:
In file included from
/home/jwakely/src/gcc/gcc/libstdc++-v3/testsuite/util/testsuite_character.h:31,
from
/home/jwakely/src/gcc/gcc/libstdc++-v3/testsuite/22_locale/money_get/cons/3.cc:25:
In static member function 'static void
std::char_traits<__gnu_cxx::character<_Value, _Int, _St> >::assign(char_type&,
const char_type&) [with _Value = unsigned int; _Int = long unsigned int; _St =
__mbstate_t]',
inlined from 'static constexpr void std::__cxx11::basic_string<_CharT,
_Traits, _Alloc>::_S_copy(_CharT*, const _CharT*, size_type) [with _CharT =
__gnu_cxx::character<unsigned int, long unsigned int>; _Traits =
std::char_traits<__gnu_cxx::character<unsigned int, long unsigned int> >;
_Alloc = std::allocator<__gnu_cxx::character<unsigned int, long unsigned int>
>]' at /home/jwakely/gcc/12/include/c++/12.0.1/bits/basic_string.h:421:23,
inlined from 'constexpr std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::size_type std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::copy(_CharT*, size_type, size_type) const [with _CharT =
__gnu_cxx::character<unsigned int, long unsigned int>; _Traits =
std::char_traits<__gnu_cxx::character<unsigned int, long unsigned int> >;
_Alloc = std::allocator<__gnu_cxx::character<unsigned int, long unsigned int>
>]' at /home/jwakely/gcc/12/include/c++/12.0.1/bits/basic_string.tcc:555:9,
inlined from 'void std::__moneypunct_cache<_CharT, _Intl>::_M_cache(const
std::locale&) [with _CharT = __gnu_cxx::character<unsigned int, long unsigned
int>; bool _Intl = false]' at
/home/jwakely/gcc/12/include/c++/12.0.1/bits/locale_facets_nonio.tcc:101:13:
/home/jwakely/gcc/12/include/c++/12.0.1/ext/pod_char_traits.h:107:9: warning:
array subscript 0 is outside array bounds of '__gnu_cxx::character<unsigned
int, long unsigned int> [0]' [-Warray-bounds]
107 | { __c1 = __c2; }
| ^~~~
That comes from here:
// When __n = 1 way faster than the general multichar
// traits_type::copy/move/assign.
_GLIBCXX20_CONSTEXPR
static void
_S_copy(_CharT* __d, const _CharT* __s, size_type __n)
{
if (__n == 1)
traits_type::assign(*__d, *__s);
else
traits_type::copy(__d, __s, __n);
}
The warning comes from the traits_type::assign call. The one guarded by __n ==
1, so that it never happens if __n == 0.
MAKE IT STOP. PLEASE MAKE IT STOP.
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56456
[Bug 56456] [meta-bug] bogus/missing -Warray-bounds