https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89733
Bug ID: 89733
Summary: [7/8/9 Regression] False positive -Wuninitialized in
C++14+ mode
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Keywords: diagnostic
Severity: normal
Priority: P3
Component: regression
Assignee: unassigned at gcc dot gnu.org
Reporter: nok.raven at gmail dot com
Target Milestone: ---
Host: x86_64
Target: x86_64
Hello,
The -Wuninitialized warning comes from one of Boost.Spirit tests in C++14+ mode
with GCC 7/8/9. GCC's ASan and UBSan does not detect violations. Clang's
-Wuninitialized and sanitizers also report nothing.
I have double checked the things, the member
(https://github.com/boostorg/spirit/blob/ae49b5c3d15d9105ce4d0f10378c7693dcaa5ae6/include/boost/spirit/home/lex/lexer/lexertl/functor_data.hpp#L400)
is not explicitly initialized in the class constructor (with explicit
initialization the warning is gone), but it is not accessed before an
assignment (checked by wrapping the value type with a boost::optional and
replacing reads to .value(), warning is already gone with the change).
I am sorry I do not have a minimal repro. Every time I try to reduce the test,
the warning either turns into -Wmaybe-uninitialized or is gone. The shortest
one I got is https://wandbox.org/permlink/yTLyG6C6arXfFlJz
```
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/qi_parse.hpp>
#include <boost/spirit/include/qi_rule.hpp>
namespace lex = boost::spirit::lex;
namespace qi = boost::spirit::qi;
namespace mpl = boost::mpl;
typedef lex::lexertl::token<char const*, mpl::vector<int> > token_type;
typedef lex::lexertl::actor_lexer<token_type> lexer_type;
typedef lex::lexer<lexer_type>::iterator_type iterator_type;
int main()
{
char const* s = "123.";
char const* first = s;
char const* last = s + std::strlen(s);
lex::lexer<lexer_type> lexer;
lex::token_def<int> integer; integer = "[0-9]+"; lexer.self += integer;
qi::rule<iterator_type> grammar = integer;
lex::tokenize_and_parse(first, last, lexer, grammar);
}
```
$ g++ -O1 -std=c++14 repro.cpp -I. -Werror=uninitialized
In file included from ./boost/spirit/home/lex/lexer/lexertl/lexer.hpp:22,
from ./boost/spirit/home/lex/lexer_lexertl.hpp:16,
from ./boost/spirit/include/lex_lexertl.hpp:16,
from repro.cpp:1:
./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp: In function 'bool
boost::spirit::lex::tokenize_and_parse(Iterator&, Iterator, const Lexer&, const
ParserExpr&) [with Iterator = const char*; Lexer =
boost::spirit::lex::lexer<boost::spirit::lex::lexertl::actor_lexer<boost::spirit::lex::lexertl::token<const
char*, boost::mpl::vector<int> > > >; ParserExpr =
boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<const
char*, boost::mpl::vector<int> >, boost::spirit::lex::lexertl::detail::data,
const char*, mpl_::bool_<true>, mpl_::bool_<true> > > >]':
./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15: error:
'<anonymous>.boost::spirit::lex::lexertl::detail::data<const char*,
mpl_::bool_<true>, mpl_::bool_<true>,
boost::variant<boost::detail::variant::over_sequence<boost::mpl::l_item<mpl_::long_<2>,
boost::iterator_range<const char*>, boost::mpl::l_item<mpl_::long_<1>, int,
boost::mpl::l_end> > > > >::end_' is used uninitialized in this function
[-Werror=uninitialized]
class data<Iterator, mpl::true_, HasState, TokenValue>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For a full test: Download Boost 1.69, unpack it, invoke
cd boost_1_69_0
./bootstrap
./b2 headers
g++ -O1 -std=c++14 libs/spirit/test/lex/regression_syntax_error.cpp -I.
-Werror=uninitialized
PS: There are bunch of -Wmaybe-uninitialized warnings related to
boost::optional usage in other tests on master (Boost 1.70 Beta) that also
seems to be false positives.