https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111374
Bug ID: 111374 Summary: Spurious -Warray-bounds warning when building std::vector (or libstdc++ bug?) Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: simon.marchi at polymtl dot ca Target Milestone: --- I encountered what seems to be either an invalid -Warray-bounds warning, or a bug in libstdc++. I see it when compiling file gdb/d-lang.c in binutils-gdb (at -O2). I wasn't able to make a small reproducer, unfortunately. I tested with gcc master (commit 316d57da5bb9205b946afc56d78582fee874e4b5). $ /opt/gcc/git/bin/g++ -x c++ -I. -I/home/smarchi/src/binutils-gdb/gdb -I/home/smarchi/src/binutils-gdb/gdb/config -DLOCALEDIR="\"/opt/gdb/git/share/locale\"" -DHAVE_CONFIG_H -I/home/smarchi/src/binutils-gdb/gdb/../include/opcode -I../bfd -I/home/smarchi/src/binutils-gdb/gdb/../bfd -I/home/smarchi/src/binutils-gdb/gdb/../include -I/home/smarchi/src/binutils-gdb/gdb/../readline/readline/.. -I/home/smarchi/src/binutils-gdb/gdb/../zlib -I../libdecnumber -I/home/smarchi/src/binutils-gdb/gdb/../libdecnumber -I/home/smarchi/src/binutils-gdb/gdb/../gnulib/import -I../gnulib/import -I/home/smarchi/src/binutils-gdb/gdb/.. -I.. -I/home/smarchi/src/binutils-gdb/gdb/../libbacktrace/ -I../libbacktrace/ -DTUI=1 -I/usr/include/guile/3.0 -I/usr -I/usr/include/python3.11 -I/usr/include/python3.11 -I/home/smarchi/src/binutils-gdb/gdb/.. -pthread -Wall -Wpointer-arith -Wno-unused -Wunused-value -Wunused-variable -Wunused-function -Wno-switch -Wno-char-subscripts -Wempty-body -Wunused-but-set-parameter -Wunused-but-set-variable -Wno-sign-compare -Wno-error=maybe-uninitialized -Wno-mismatched-tags -Wsuggest-override -Wimplicit-fallthrough=3 -Wduplicated-cond -Wshadow=local -Wdeprecated-copy -Wdeprecated-copy-dtor -Wredundant-move -Wmissing-declarations -Wstrict-null-sentinel -Wformat -Wformat-nonliteral -Werror -g3 -O2 -fsanitize=address -D_GLIBCXX_DEBUG=1 -c -o d-lang.o -MT d-lang.o -MMD -MP -MF ./.deps/d-lang.Tpo /home/smarchi/src/binutils-gdb/gdb/d-lang.c In file included from /opt/gcc/git/include/c++/14.0.0/bits/hashtable_policy.h:36, from /opt/gcc/git/include/c++/14.0.0/bits/hashtable.h:35, from /opt/gcc/git/include/c++/14.0.0/bits/unordered_map.h:33, from /opt/gcc/git/include/c++/14.0.0/unordered_map:41, from /opt/gcc/git/include/c++/14.0.0/functional:71, from /home/smarchi/src/binutils-gdb/gdb/../gdbsupport/ptid.h:35, from /home/smarchi/src/binutils-gdb/gdb/../gdbsupport/common-defs.h:206, from /home/smarchi/src/binutils-gdb/gdb/defs.h:26, from /home/smarchi/src/binutils-gdb/gdb/d-lang.c:20: In static member function ‘static _Up* std::__copy_move<_IsMove, true, std::random_access_iterator_tag>::__copy_m(_Tp*, _Tp*, _Up*) [with _Tp = const char* const; _Up = const char*; bool _IsMove = false]’, inlined from ‘_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false; _II = const char* const*; _OI = const char**]’ at /opt/gcc/git/include/c++/14.0.0/bits/stl_algobase.h:509:30, inlined from ‘_OI std::__copy_move_a1(_II, _II, _OI) [with bool _IsMove = false; _II = const char* const*; _OI = const char**]’ at /opt/gcc/git/include/c++/14.0.0/bits/stl_algobase.h:536:42, inlined from ‘_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false; _II = const char* const*; _OI = const char**]’ at /opt/gcc/git/include/c++/14.0.0/bits/stl_algobase.h:543:31, inlined from ‘_OI std::copy(_II, _II, _OI) [with _II = const char* const*; _OI = const char**]’ at /opt/gcc/git/include/c++/14.0.0/bits/stl_algobase.h:636:7, inlined from ‘static _ForwardIterator std::__uninitialized_copy<true>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const char* const*; _ForwardIterator = const char**]’ at /opt/gcc/git/include/c++/14.0.0/bits/stl_uninitialized.h:150:27, inlined from ‘_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const char* const*; _ForwardIterator = const char**]’ at /opt/gcc/git/include/c++/14.0.0/bits/stl_uninitialized.h:188:15, inlined from ‘_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, allocator<_Tp>&) [with _InputIterator = const char* const*; _ForwardIterator = const char**; _Tp = const char*]’ at /opt/gcc/git/include/c++/14.0.0/bits/stl_uninitialized.h:376:37, inlined from ‘void std::__cxx1998::vector<_Tp, _Alloc>::_M_range_initialize(_ForwardIterator, _ForwardIterator, std::forward_iterator_tag) [with _ForwardIterator = const char* const*; _Tp = const char*; _Alloc = std::allocator<const char*>]’ at /opt/gcc/git/include/c++/14.0.0/bits/stl_vector.h:1697:33, inlined from ‘std::__cxx1998::vector<_Tp, _Alloc>::vector(std::initializer_list<_Tp>, const allocator_type&) [with _Tp = const char*; _Alloc = std::allocator<const char*>]’ at /opt/gcc/git/include/c++/14.0.0/bits/stl_vector.h:682:21, inlined from ‘std::__debug::vector<_Tp, _Allocator>::vector(std::initializer_list<_Tp>, const allocator_type&) [with _Tp = const char*; _Allocator = std::allocator<const char*>]’ at /opt/gcc/git/include/c++/14.0.0/debug/vector:228:23, inlined from ‘virtual const std::__debug::vector<const char*>& d_language::filename_extensions() const’ at /home/smarchi/src/binutils-gdb/gdb/d-lang.c:83:62: /opt/gcc/git/include/c++/14.0.0/bits/stl_algobase.h:440:30: error: ‘void* __builtin_memmove(void*, const void*, long unsigned int)’ forming offset 8 is out of the bounds [0, 8] [-Werror=array-bounds=] 440 | __builtin_memmove(__result, __first, sizeof(_Tp) * _Num); | ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The code in question is: const std::vector<const char *> &filename_extensions () const override { static const std::vector<const char *> extensions { ".d" }; <--- THIS LINE return extensions; } Initializing the vector just needs copying 8 bytes (the pointer to the ".d" string). So either the code accesses further than it needs, or it doesn't and the warning is spurious.