Re: std::variant corruption

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2 Sept 2024 at 18:42, Jonathan Wakely <jwakely.gcc@xxxxxxxxx> wrote:
>
> On Mon, 2 Sept 2024 at 18:40, Jonathan Wakely <jwakely.gcc@xxxxxxxxx> wrote:
> >
> > On Mon, 2 Sept 2024 at 18:03, James K. Lowden <jklowden@xxxxxxxxxxxxxxx> wrote:
> > >
> > > I am experiencing problems that appear to be in std::variant.  I wonder
> > > if this has been reported before, and I just need to upgrade.
> > >
> > > The problem appears to be in this switch:
> > >
> > > class number_t {
> > >   enum type_t { int_e, float_e };
> > >   std::variant<ssize_t, double> value;
> > >  public:
> > >  ...
> > >   number_t& operator=( const number_t& that ) {
> > >     assert( that.value.index() != std::variant_npos );
> > >     switch( type_t(that.value.index()) ) {
> > >     case int_e: value = std::get<ssize_t>(that.value); break;
> > >     case float_e: value = std::get<double>(that.value); break;
> > >     }
> > >     return *this;
> > >   }
> > >
> > > That's not how I wrote the code originally.  That's a re-write to try to isolate the problem.
> > >
> > > valgrind reports:
> > >
> > > ==999106== Conditional jump or move depends on uninitialised value(s)
> > > ==999106==    at 0x1130B8: number_t::operator=(number_t const&) (expression.h:80)

Which line is 80, the switch(...) one?


> > > ==999106==    by 0x123C23: env_t::numop(number_t& (*)(number_t&, exp_t const&), exp_t const&) (core.cc:429)
> > > ==999106==    by 0x123FA3: env_t::mul(exp_t const&, env_t&) (core.cc:457)
> > > ==999106==    by 0x12286F: env_t::eval(exp_t const&, env_t&) (core.cc:148)
> > > ==999106==    by 0x122767: env_t::eval(exp_t const&, env_t&) (core.cc:136)
> > > ==999106==    by 0x1104EB: yyparse() (parse.y:319)
> > > ==999106==    by 0x12DF3F: repl() (main.cc:30)
> > > ==999106==    by 0x12E20F: main (main.cc:79)
> > >
> > > It seems to me that if the assert doesn't trip, then the object must be initialized, in which case the switch cannot depend on an uninitialized value.
> >
> > I don't think your assumption is valid. If the variant's _M_index
> > value is uninitialized, then the assert could pass because the index
> > could be any garbage value. Is the RHS of the assignment (the object
> > that the 'that' reference is bound to) correctly initialized? Are you
> > sure?



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux