From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 24433385558F; Wed, 23 Nov 2022 23:24:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 24433385558F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1669245855; bh=EhV6MfgZnx/x4Em1aVy2a9mNendxNSItbli662Ijnxc=; h=From:To:Subject:Date:From; b=TihAjBZJL5NDOt48Z8uP2QuP/zNorF4g5EVohuSjvjCK6Y9M+csSIN7C7JBSIRDGt cVTSd7GImrivAGwJirDWy8u9ERwfBqtxYVuOONY5CQ2EsrUkx9yiAvkT/sTZa2pQBV cOqW6bDtYe12hW2eYBks7zW278xLRVIwKp3TYZC8= From: "cuzdav at gmail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/107852] New: Spurious warnings stringop-overflow and array-bounds copying data as bytes into vector Date: Wed, 23 Nov 2022 23:24:13 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: tree-optimization X-Bugzilla-Version: 12.2.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: cuzdav at gmail dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter target_milestone attachments.created Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 List-Id: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D107852 Bug ID: 107852 Summary: Spurious warnings stringop-overflow and array-bounds copying data as bytes into vector Product: gcc Version: 12.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: cuzdav at gmail dot com Target Milestone: --- Created attachment 53957 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=3D53957&action=3Dedit preprocessed source code, if that's useful. Starting with gcc 12 and continuing into the current trunk, with optimizati= ons enabled, the compiler emits warnings from static analysis regarding copying data internal to the vector class, both on Compiler Explorer, and on my loc= al linux box running Centos9. Options: g++ warnings.cpp -Werror -O2 -Warray-bounds=20 Code: #include std::vector bytes; int value{}; void copyValueBytes() { bytes.clear(); auto ptr =3D reinterpret_cast(&value); bytes.insert(bytes.end(), ptr, ptr + sizeof(value)); } https://godbolt.org/z/MfjM9xKjP Observations: * if I don't clear() the vector first, it does not report any errors * if I call bytes.resize(0) it reports the same output * if I call bytes.resize(1) it compiles cleanly * if I use a std::deque instead of a vector, it compiles cleanly A reinterpret_cast always is eye-raising, but I think this is a valid use s= ince its address is casted to a char*, a compatible type. Output: In file included from /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/vector:60, from :1: In static member function 'static _Tp* std::__copy_move<_IsMove, true, std::random_access_iterator_tag>::__copy_m(const _Tp*, const _Tp*, _Tp*) [w= ith _Tp =3D char; bool _IsMove =3D true]', inlined from '_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove= =3D true; _II =3D char*; _OI =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:49= 5:30, inlined from '_OI std::__copy_move_a1(_II, _II, _OI) [with bool _IsMove= =3D true; _II =3D char*; _OI =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:52= 2:42, inlined from '_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = =3D true; _II =3D char*; _OI =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:52= 9:31, inlined from '_OI std::copy(_II, _II, _OI) [with _II =3D move_iterator; _OI =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:62= 0:7, inlined from 'static _ForwardIterator std::__uninitialized_copy::__uninit_copy(_InputIterator, _InputIterat= or, _ForwardIterator) [with _InputIterator =3D std::move_iterator; _ForwardIterator =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_uninitialized= .h:147:27, inlined from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator =3D move_iterator; _ForwardIterator =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_uninitialized= .h:185:15, inlined from '_ForwardIterator std::__uninitialized_copy_a(_InputIterat= or, _InputIterator, _ForwardIterator, allocator<_Tp>&) [with _InputIterator =3D move_iterator; _ForwardIterator =3D char*; _Tp =3D char]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_uninitialized= .h:372:37, inlined from '_ForwardIterator std::__uninitialized_move_if_noexcept_a(_InputIterator, _InputIterator, _ForwardIterator, _Allocator&) [with _InputIterator =3D char*; _ForwardIter= ator =3D char*; _Allocator =3D allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_uninitialized= .h:397:2, inlined from 'void std::vector<_Tp, _Alloc>::_M_range_insert(iterator, _ForwardIterator, _ForwardIterator, std::forward_iterator_tag) [with _ForwardIterator =3D const char*; _Tp =3D char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/vector.tcc:801:9, inlined from 'void std::vector<_Tp, _Alloc>::_M_insert_dispatch(iterato= r, _InputIterator, _InputIterator, std::__false_type) [with _InputIterator =3D= const char*; _Tp =3D char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_vector.h:1779= :19, inlined from 'std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(const_iterator, _InputIterator, _InputIterator) [with _InputIterator =3D const char*; =3D void; _Tp =3D = char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_vector.h:1481= :22, inlined from 'void copyValueBytes()' at :9:17: /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:43= 1:30: error: 'void* __builtin_memcpy(void*, const void*, long unsigned int)' offs= et 4 is out of the bounds [0, 4] [-Werror=3Darray-bounds] 431 | __builtin_memmove(__result, __first, sizeof(_Tp) * _Num= ); | ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:43= 1:30: error: 'void* __builtin_memcpy(void*, const void*, long unsigned int)' writ= ing 1 or more bytes into a region of size 0 overflows the destination [-Werror=3Dstringop-overflow=3D] In file included from /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/x86_64-linux-gnu/bits/= c++allocator.h:33, from /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/allocator.h:46, from /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/vector:61: In member function '_Tp* std::__new_allocator<_Tp>::allocate(size_type, con= st void*) [with _Tp =3D char]', inlined from 'static _Tp* std::allocator_traits >::allocate(allocator_type&, size_type) [with _Tp =3D char]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/alloc_traits.h:46= 4:28, inlined from 'std::_Vector_base<_Tp, _Alloc>::pointer std::_Vector_base<_Tp, _Alloc>::_M_allocate(std::size_t) [with _Tp =3D char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_vector.h:378:= 33, inlined from 'void std::vector<_Tp, _Alloc>::_M_range_insert(iterator, _ForwardIterator, _ForwardIterator, std::forward_iterator_tag) [with _ForwardIterator =3D const char*; _Tp =3D char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/vector.tcc:787:40, inlined from 'void std::vector<_Tp, _Alloc>::_M_insert_dispatch(iterato= r, _InputIterator, _InputIterator, std::__false_type) [with _InputIterator =3D= const char*; _Tp =3D char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_vector.h:1779= :19, inlined from 'std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(const_iterator, _InputIterator, _InputIterator) [with _InputIterator =3D const char*; =3D void; _Tp =3D = char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_vector.h:1481= :22, inlined from 'void copyValueBytes()' at :9:17: /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/new_allocator.h:1= 37:55: note: at offset [5, 8] into destination object of size 4 allocated by 'oper= ator new' 137 | return static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp))); | ^ cc1plus: all warnings being treated as errors ASM generation compiler returned: 1 In file included from /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/vector:60, from :1: In static member function 'static _Tp* std::__copy_move<_IsMove, true, std::random_access_iterator_tag>::__copy_m(const _Tp*, const _Tp*, _Tp*) [w= ith _Tp =3D char; bool _IsMove =3D true]', inlined from '_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove= =3D true; _II =3D char*; _OI =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:49= 5:30, inlined from '_OI std::__copy_move_a1(_II, _II, _OI) [with bool _IsMove= =3D true; _II =3D char*; _OI =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:52= 2:42, inlined from '_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = =3D true; _II =3D char*; _OI =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:52= 9:31, inlined from '_OI std::copy(_II, _II, _OI) [with _II =3D move_iterator; _OI =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:62= 0:7, inlined from 'static _ForwardIterator std::__uninitialized_copy::__uninit_copy(_InputIterator, _InputIterat= or, _ForwardIterator) [with _InputIterator =3D std::move_iterator; _ForwardIterator =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_uninitialized= .h:147:27, inlined from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator =3D move_iterator; _ForwardIterator =3D char*]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_uninitialized= .h:185:15, inlined from '_ForwardIterator std::__uninitialized_copy_a(_InputIterat= or, _InputIterator, _ForwardIterator, allocator<_Tp>&) [with _InputIterator =3D move_iterator; _ForwardIterator =3D char*; _Tp =3D char]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_uninitialized= .h:372:37, inlined from '_ForwardIterator std::__uninitialized_move_if_noexcept_a(_InputIterator, _InputIterator, _ForwardIterator, _Allocator&) [with _InputIterator =3D char*; _ForwardIter= ator =3D char*; _Allocator =3D allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_uninitialized= .h:397:2, inlined from 'void std::vector<_Tp, _Alloc>::_M_range_insert(iterator, _ForwardIterator, _ForwardIterator, std::forward_iterator_tag) [with _ForwardIterator =3D const char*; _Tp =3D char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/vector.tcc:801:9, inlined from 'void std::vector<_Tp, _Alloc>::_M_insert_dispatch(iterato= r, _InputIterator, _InputIterator, std::__false_type) [with _InputIterator =3D= const char*; _Tp =3D char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_vector.h:1779= :19, inlined from 'std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(const_iterator, _InputIterator, _InputIterator) [with _InputIterator =3D const char*; =3D void; _Tp =3D = char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_vector.h:1481= :22, inlined from 'void copyValueBytes()' at :9:17: /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:43= 1:30: error: 'void* __builtin_memcpy(void*, const void*, long unsigned int)' offs= et 4 is out of the bounds [0, 4] [-Werror=3Darray-bounds] 431 | __builtin_memmove(__result, __first, sizeof(_Tp) * _Num= ); | ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algobase.h:43= 1:30: error: 'void* __builtin_memcpy(void*, const void*, long unsigned int)' writ= ing 1 or more bytes into a region of size 0 overflows the destination [-Werror=3Dstringop-overflow=3D] In file included from /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/x86_64-linux-gnu/bits/= c++allocator.h:33, from /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/allocator.h:46, from /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/vector:61: In member function '_Tp* std::__new_allocator<_Tp>::allocate(size_type, con= st void*) [with _Tp =3D char]', inlined from 'static _Tp* std::allocator_traits >::allocate(allocator_type&, size_type) [with _Tp =3D char]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/alloc_traits.h:46= 4:28, inlined from 'std::_Vector_base<_Tp, _Alloc>::pointer std::_Vector_base<_Tp, _Alloc>::_M_allocate(std::size_t) [with _Tp =3D char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_vector.h:378:= 33, inlined from 'void std::vector<_Tp, _Alloc>::_M_range_insert(iterator, _ForwardIterator, _ForwardIterator, std::forward_iterator_tag) [with _ForwardIterator =3D const char*; _Tp =3D char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/vector.tcc:787:40, inlined from 'void std::vector<_Tp, _Alloc>::_M_insert_dispatch(iterato= r, _InputIterator, _InputIterator, std::__false_type) [with _InputIterator =3D= const char*; _Tp =3D char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_vector.h:1779= :19, inlined from 'std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(const_iterator, _InputIterator, _InputIterator) [with _InputIterator =3D const char*; =3D void; _Tp =3D = char; _Alloc =3D std::allocator]' at /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_vector.h:1481= :22, inlined from 'void copyValueBytes()' at :9:17: /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/new_allocator.h:1= 37:55: note: at offset [5, 8] into destination object of size 4 allocated by 'oper= ator new' 137 | return static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp))); | ^ cc1plus: all warnings being treated as errors Execution build compiler returned: 1=