https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105562
Bug ID: 105562
Summary: [12 Regression] std::function<bool(char)>::_M_invoker
may be used uninitialized in std:regex move with
-fno-strict-aliasing
Product: gcc
Version: 12.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: andrey.vihrov at gmail dot com
Target Milestone: ---
Consider the following sample:
#include <regex>
int main()
{
std::regex a(".");
std::regex b(std::move(a));
}
Since GCC 12.1, compiling this code with "g++ -Wall -O1 -fno-strict-aliasing
x.cpp" gives
In file included from /usr/include/c++/12.1.0/regex:48,
from x.cpp:1:
In constructor 'std::function<_Res(_ArgTypes
...)>::function(std::function<_Res(_ArgTypes ...)>&&) [with _Res = bool;
_ArgTypes = {char}]',
inlined from
'std::__detail::_State<_Char_type>::_State(std::__detail::_State<_Char_type>&&)
[with _Char_type = char]' at
/usr/include/c++/12.1.0/bits/regex_automaton.h:149:4,
inlined from 'std::__detail::_StateIdT
std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_end() [with _TraitsT =
std::__cxx11::regex_traits<char>]' at
/usr/include/c++/12.1.0/bits/regex_automaton.h:290:24:
/usr/include/c++/12.1.0/bits/std_function.h:405:42: warning:
'*(std::function<bool(char)>*)((char*)&__tmp + offsetof(std::__detail::_StateT,
std::__detail::_State<char>::<unnamed>.std::__detail::_State_base::<unnamed>)).std::function<bool(char)>::_M_invoker'
may be used uninitialized [-Wmaybe-uninitialized]
405 | : _Function_base(), _M_invoker(__x._M_invoker)
| ~~~~^~~~~~~~~~
In file included from /usr/include/c++/12.1.0/regex:63:
/usr/include/c++/12.1.0/bits/regex_automaton.h: In member function
'std::__detail::_StateIdT
std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_end() [with _TraitsT =
std::__cxx11::regex_traits<char>]':
/usr/include/c++/12.1.0/bits/regex_automaton.h:287:17: note: '__tmp' declared
here
287 | _StateT __tmp(_S_opcode_subexpr_end);
| ^~~~~
In member function 'bool std::_Function_base::_M_empty() const',
inlined from 'std::function<_Res(_ArgTypes ...)>::operator bool() const
[with _Res = bool; _ArgTypes = {char}]' at
/usr/include/c++/12.1.0/bits/std_function.h:574:25,
inlined from 'std::function<_Res(_ArgTypes
...)>::function(std::function<_Res(_ArgTypes ...)>&&) [with _Res = bool;
_ArgTypes = {char}]' at /usr/include/c++/12.1.0/bits/std_function.h:407:6,
inlined from
'std::__detail::_State<_Char_type>::_State(std::__detail::_State<_Char_type>&&)
[with _Char_type = char]' at
/usr/include/c++/12.1.0/bits/regex_automaton.h:149:4,
inlined from 'std::__detail::_StateIdT
std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_end() [with _TraitsT =
std::__cxx11::regex_traits<char>]' at
/usr/include/c++/12.1.0/bits/regex_automaton.h:290:24:
/usr/include/c++/12.1.0/bits/std_function.h:247:37: warning: '*(const
std::_Function_base*)((char*)&__tmp + offsetof(std::__detail::_StateT,
std::__detail::_State<char>::<unnamed>.std::__detail::_State_base::<unnamed>)).std::_Function_base::_M_manager'
may be used uninitialized [-Wmaybe-uninitialized]
247 | bool _M_empty() const { return !_M_manager; }
| ^~~~~~~~~~
/usr/include/c++/12.1.0/bits/regex_automaton.h: In member function
'std::__detail::_StateIdT
std::__detail::_NFA<_TraitsT>::_M_insert_subexpr_end() [with _TraitsT =
std::__cxx11::regex_traits<char>]':
/usr/include/c++/12.1.0/bits/regex_automaton.h:287:17: note: '__tmp' declared
here
287 | _StateT __tmp(_S_opcode_subexpr_end);
| ^~~~~
There are no warnings with -fstrict-aliasing. Related resources:
* https://gcc.gnu.org/pipermail/gcc/2021-July/236851.html
* https://gcc.gnu.org/g:c22bcfd2f7dc9bb5ad394720f4a612327dc898ba