Skip to content

"May be used uninitialized" issues reported by GCC 15.2.0 #495

@Harry-Chen

Description

@Harry-Chen

When trying to compile the projects with GCC 15.2.0, multiple similar warnings (in my example they are errors due to -Wall -Werror) would occur:

/usr/lib/ccache/c++  -I/build/reflect-cpp-0.20.0+ds/PUBLIC -I/build/reflect-cpp-0.20.0+ds/include -I/build/reflect-cpp-0.20.0+ds/include/rfl/thirdparty -I/build/reflect-cpp-0.20.0+ds/obj-x86_64-linux-gnu/include -isystem //include -isystem /usr/include/bson-2.1.0 -g -O2 -ffile-prefix-map=/build/reflect-cpp-0.20.0+ds=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection  -Wdate-time -D_FORTIFY_SOURCE=2 -O3 -Wall -Werror -ggdb -ftemplate-backtrace-limit=0 -std=gnu++20 -DTOML_HEADER_ONLY=0 -DTOML_SHARED_LIB=1 -DGTEST_HAS_PTHREAD=1 -Winvalid-pch -include /build/reflect-cpp-0.20.0+ds/obj-x86_64-linux-gnu/tests/json/CMakeFiles/reflect-cpp-json-tests.dir/cmake_pch.hxx -MD -MT tests/json/CMakeFiles/reflect-cpp-json-tests.dir/test_add_struct_name.cpp.o -MF tests/json/CMakeFiles/reflect-cpp-json-tests.dir/test_add_struct_name.cpp.o.d -o tests/json/CMakeFiles/reflect-cpp-json-tests.dir/test_add_struct_name.cpp.o -c /build/reflect-cpp-0.20.0+ds/tests/json/test_add_struct_name.cpp
In file included from /usr/include/c++/15/string:56,
                 from /build/reflect-cpp-0.20.0+ds/include/rfl/Literal.hpp:7,
                 from /build/reflect-cpp-0.20.0+ds/include/rfl/Field.hpp:10,
                 from /build/reflect-cpp-0.20.0+ds/include/rfl/AddStructName.hpp:6,
                 from /build/reflect-cpp-0.20.0+ds/include/rfl.hpp:10,
                 from /build/reflect-cpp-0.20.0+ds/obj-x86_64-linux-gnu/tests/json/CMakeFiles/reflect-cpp-json-tests.dir/cmake_pch.hxx:5,
                 from <command-line>:
In member function ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size() const [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’,
    inlined from ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::length() const [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ at /usr/include/c++/15/bits/basic_string.h:1176:20,
    inlined from ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ at /usr/include/c++/15/bits/basic_string.h:617:20,
    inlined from ‘constexpr rfl::Error::Error(const rfl::Error&)’ at /build/reflect-cpp-0.20.0+ds/include/rfl/Result.hpp:25:3,
    inlined from ‘constexpr void std::_Construct(_Tp*, _Args&& ...) [with _Tp = rfl::Error; _Args = {const rfl::Error&}]’ at /usr/include/c++/15/bits/stl_construct.h:133:7,
    inlined from ‘constexpr void std::_Optional_payload_base<_Tp>::_M_construct(_Args&& ...) [with _Args = {const rfl::Error&}; _Tp = rfl::Error]’ at /usr/include/c++/15/optional:298:19,
    inlined from ‘constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base(bool, const std::_Optional_payload_base<_Tp>&) [with _Tp = rfl::Error]’ at /usr/include/c++/15/optional:144:22,
    inlined from ‘constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base(bool, const std::_Optional_payload_base<_Tp>&) [with _Tp = rfl::Error]’ at /usr/include/c++/15/optional:140:7,
    inlined from ‘constexpr std::_Optional_payload<rfl::Error, true, false, false>::_Optional_payload(bool, const std::_Optional_payload_base<rfl::Error>&) [inherited from std::_Optional_payload_base<rfl::Error>]’ at /usr/include/c++/15/optional:419:42,
    inlined from ‘constexpr std::_Optional_payload<rfl::Error, false, false, false>::_Optional_payload(bool, const std::_Optional_payload_base<rfl::Error>&) [inherited from std::_Optional_payload_base<rfl::Error>]’ at /usr/include/c++/15/optional:453:57,
    inlined from ‘constexpr std::_Optional_base<_Tp, <anonymous>, <anonymous> >::_Optional_base(const std::_Optional_base<_Tp, <anonymous>, <anonymous> >&) [with _Tp = rfl::Error; bool <anonymous> = false; bool <anonymous> = false]’ at /usr/include/c++/15/optional:513:9,
    inlined from ‘constexpr std::optional<rfl::Error>::optional(const std::optional<rfl::Error>&)’ at /usr/include/c++/15/optional:778:11,
    inlined from ‘constexpr std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = std::array<bool, 8>&; _U2 = std::optional<rfl::Error>&; _T1 = std::array<bool, 8>; _T2 = std::optional<rfl::Error>]’ at /usr/include/c++/15/bits/stl_pair.h:464:35,
    inlined from ‘constexpr std::pair<typename std::__strip_reference_wrapper<typename std::decay<_Tp>::type>::__type, typename std::__strip_reference_wrapper<typename std::decay<_Tp2>::type>::__type> std::make_pair(_T1&&, _T2&&) [with _T1 = array<bool, 8>&; _T2 = optional<rfl::Error>&]’ at /usr/include/c++/15/bits/stl_pair.h:1169:72,
    inlined from ‘static std::pair<std::array<bool, rfl::NamedTuple<FieldTypes ...>::size()>, std::optional<rfl::Error> > rfl::parsing::NamedTupleParser<R, W, _ignore_empty_containers, _all_required, _no_field_names, ProcessorsType, FieldTypes>::read_object_or_array(const R&, const InputObjectOrArrayType&, NamedTupleType*) [with R = rfl::json::Reader; W = rfl::json::Writer; bool _ignore_empty_containers = false; bool _all_required = false; bool _no_field_names = false; ProcessorsType = rfl::Processors<rfl::AddStructName<rfl::internal::StringLiteral<5>{std::array<char, 5>{"type"}}> >; FieldTypes = {rfl::Field<rfl::internal::StringLiteral<5>{std::array<char, 5>{"type"}}, rfl::Literal<rfl::internal::StringLiteral<7>{std::array<char, 7>{"Person"}}> >, rfl::Field<rfl::internal::StringLiteral<10>{std::array<char, 10>{"firstName"}}, rfl::Rename<rfl::internal::StringLiteral<10>{std::array<char, 10>{"firstName"}}, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >*>, rfl::Field<rfl::internal::StringLiteral<9>{std::array<char, 9>{"lastName"}}, rfl::Rename<rfl::internal::StringLiteral<9>{std::array<char, 9>{"lastName"}}, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >*>, rfl::Field<rfl::internal::StringLiteral<5>{std::array<char, 5>{"town"}}, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*>, rfl::Field<rfl::internal::StringLiteral<9>{std::array<char, 9>{"birthday"}}, rfl::Timestamp<rfl::internal::StringLiteral<9>{std::array<char, 9>{"%Y-%m-%d"}}>*>, rfl::Field<rfl::internal::StringLiteral<4>{std::array<char, 4>{"age"}}, rfl::Validator<unsigned int, rfl::Minimum<0>, rfl::Maximum<130> >*>, rfl::Field<rfl::internal::StringLiteral<6>{std::array<char, 6>{"email"}}, rfl::Validator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, rfl::PatternValidator<rfl::internal::StringLiteral<51>{std::array<char, 51>{"^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$"}}, rfl::internal::StringLiteral<6>{std::array<char, 6>{"Email"}}> >*>, rfl::Field<rfl::internal::StringLiteral<9>{std::array<char, 9>{"children"}}, std::vector<test_add_struct_name::Person, std::allocator<test_add_struct_name::Person> >*>}]’ at /build/reflect-cpp-0.20.0+ds/include/rfl/parsing/NamedTupleParser.hpp:315:37:
/usr/include/c++/15/bits/basic_string.h:1165:19: error: ‘*(const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)((char*)&err + offsetof(std::optional<rfl::Error>,std::optional<rfl::Error>::<unnamed>.std::_Optional_base<rfl::Error, false, false>::_M_payload.std::_Optional_payload<rfl::Error, false, false, false>::<unnamed>.std::_Optional_payload<rfl::Error, true, false, false>::<unnamed>.std::_Optional_payload_base<rfl::Error>::_M_payload)).std::__cxx11::basic_string<char>::_M_string_length’ may be used uninitialized [-Werror=maybe-uninitialized]
 1165 |         size_type __sz = _M_string_length;
      |                   ^~~~
In file included from /build/reflect-cpp-0.20.0+ds/include/rfl/parsing/Parser_named_tuple.hpp:4,
                 from /build/reflect-cpp-0.20.0+ds/include/rfl/parsing/Parser.hpp:13,
                 from /build/reflect-cpp-0.20.0+ds/include/rfl/generic/Parser.hpp:4,
                 from /build/reflect-cpp-0.20.0+ds/include/rfl/generic/read.hpp:10,
                 from /build/reflect-cpp-0.20.0+ds/include/rfl/from_generic.hpp:5,
                 from /build/reflect-cpp-0.20.0+ds/include/rfl.hpp:63:
/build/reflect-cpp-0.20.0+ds/include/rfl/parsing/NamedTupleParser.hpp: In static member function ‘static std::pair<std::array<bool, rfl::NamedTuple<FieldTypes ...>::size()>, std::optional<rfl::Error> > rfl::parsing::NamedTupleParser<R, W, _ignore_empty_containers, _all_required, _no_field_names, ProcessorsType, FieldTypes>::read_object_or_array(const R&, const InputObjectOrArrayType&, NamedTupleType*) [with R = rfl::json::Reader; W = rfl::json::Writer; bool _ignore_empty_containers = false; bool _all_required = false; bool _no_field_names = false; ProcessorsType = rfl::Processors<rfl::AddStructName<rfl::internal::StringLiteral<5>{std::array<char, 5>{"type"}}> >; FieldTypes = {rfl::Field<rfl::internal::StringLiteral<5>{std::array<char, 5>{"type"}}, rfl::Literal<rfl::internal::StringLiteral<7>{std::array<char, 7>{"Person"}}> >, rfl::Field<rfl::internal::StringLiteral<10>{std::array<char, 10>{"firstName"}}, rfl::Rename<rfl::internal::StringLiteral<10>{std::array<char, 10>{"firstName"}}, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >*>, rfl::Field<rfl::internal::StringLiteral<9>{std::array<char, 9>{"lastName"}}, rfl::Rename<rfl::internal::StringLiteral<9>{std::array<char, 9>{"lastName"}}, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >*>, rfl::Field<rfl::internal::StringLiteral<5>{std::array<char, 5>{"town"}}, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*>, rfl::Field<rfl::internal::StringLiteral<9>{std::array<char, 9>{"birthday"}}, rfl::Timestamp<rfl::internal::StringLiteral<9>{std::array<char, 9>{"%Y-%m-%d"}}>*>, rfl::Field<rfl::internal::StringLiteral<4>{std::array<char, 4>{"age"}}, rfl::Validator<unsigned int, rfl::Minimum<0>, rfl::Maximum<130> >*>, rfl::Field<rfl::internal::StringLiteral<6>{std::array<char, 6>{"email"}}, rfl::Validator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, rfl::PatternValidator<rfl::internal::StringLiteral<51>{std::array<char, 51>{"^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$"}}, rfl::internal::StringLiteral<6>{std::array<char, 6>{"Email"}}> >*>, rfl::Field<rfl::internal::StringLiteral<9>{std::array<char, 9>{"children"}}, std::vector<test_add_struct_name::Person, std::allocator<test_add_struct_name::Person> >*>}]’:
/build/reflect-cpp-0.20.0+ds/include/rfl/parsing/NamedTupleParser.hpp:308:26: note: ‘err’ declared here
  308 |     std::optional<Error> err;
      |                          ^~~
cc1plus: all warnings being treated as errors

Please help to investigate whether this is yet another false warning (so I should add -Wno-maybe-uninitialized), or if there is actually a use-before-def.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions