std::variant corruption

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

 



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)
==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.  

Many thanks.

--jkl



[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