public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/111374] New: Spurious -Warray-bounds warning when building std::vector (or libstdc++ bug?)
@ 2023-09-11 18:17 simon.marchi at polymtl dot ca
  0 siblings, 0 replies; only message in thread
From: simon.marchi at polymtl dot ca @ 2023-09-11 18:17 UTC (permalink / raw)
  To: gcc-bugs

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.

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-09-11 18:17 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-11 18:17 [Bug c++/111374] New: Spurious -Warray-bounds warning when building std::vector (or libstdc++ bug?) simon.marchi at polymtl dot ca

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).