valgrind жалуется, что условный переход или перемещение зависит от неинициализированных значений

0

Я выполняю свое приложение через valgrind из-за других различных проблем, и я продолжаю видеть предупреждения о:

==26447== Conditional jump or move depends on uninitialised value(s)
==26447==    at 0x5C244F: int std::__int_to_char<char, unsigned long>(char*, unsigned long, char const*, std::_Ios_Fmtflags, bool) (in /home/alex/projects/Icarus/trunk/build/icarus)
==26447==    by 0x5C2BB3: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<unsigned long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, unsigned long) const (in /home/alex/projects/Icarus/trunk/build/icarus)
==26447==    by 0x5C2E1C: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, unsigned long) const (in /home/alex/projects/Icarus/trunk/build/icarus)
==26447==    by 0x5DB0BD: std::ostream& std::ostream::_M_insert<unsigned long>(unsigned long) (in /home/alex/projects/Icarus/trunk/build/icarus)
==26447==    by 0x55C9B8: ExampleProcessor::Process(std::shared_ptr<Example>) (ExampleProcessor.hpp:49)
==26447==    by 0x55D139: Controller::FIFO(std::shared_ptr<Message>) (Controller.hpp:51)
==26447==    by 0x55D7C2: TCPConnection::respond(std::string) (TCPConnection.hpp:71)
==26447==    by 0x55DC5E: TCPConnection::handle_read(boost::system::error_code const&, unsigned long) (TCPConnection.hpp:144)
==26447==    by 0x595CD8: void boost::_mfi::mf2<void, TCPConnection, boost::system::error_code const&, unsigned long>::call<boost::shared_ptr<TCPConnection>, boost::system::error_code const, unsigned long>(boost::shared_ptr<TCPConnection>&, void const*, boost::system::error_code const&, unsigned long&) const (mem_fn_template.hpp:271)
==26447==    by 0x591412: void boost::_mfi::mf2<void, TCPConnection, boost::system::error_code const&, unsigned long>::operator()<boost::shared_ptr<TCPConnection> >(boost::shared_ptr<TCPConnection>&, boost::system::error_code const&, unsigned long) const (mem_fn_template.hpp:286)
==26447==    by 0x58A46D: void boost::_bi::list3<boost::_bi::value<boost::shared_ptr<TCPConnection> >, boost::arg<1> (*)(), boost::arg<2> (*)()>::operator()<boost::_mfi::mf2<void, TCPConnection, boost::system::error_code const&, unsigned long>, boost::_bi::list2<boost::system::error_code const&, unsigned long const&> >(boost::_bi::type<void>, boost::_mfi::mf2<void, TCPConnection, boost::system::error_code const&, unsigned long>&, boost::_bi::list2<boost::system::error_code const&, unsigned long const&>&, int) (bind.hpp:392)
==26447==    by 0x5812BD: void boost::_bi::bind_t<void, boost::_mfi::mf2<void, TCPConnection, boost::system::error_code const&, unsigned long>, boost::_bi::list3<boost::_bi::value<boost::shared_ptr<TCPConnection> >, boost::arg<1> (*)(), boost::arg<2> (*)()> >::operator()<boost::system::error_code, unsigned long>(boost::system::error_code const&, unsigned long const&) (bind_template.hpp:102)
==26447==  Uninitialised value was created by a stack allocation
==26447==    at 0x553EAA: ConceptGraph::makeHash() (ConceptGraph.hpp:258)

Итак, я немного почитал и обнаружил, что могу импортировать memcheck и запрашивать конкретные запросы памяти:

std::size_t makeHash ( )
{
  std::size_t tmp;

  for ( auto & concept : _concepts )
     tmp += concept->Hash();

  for ( auto & relation : _relations )
     tmp += relation->Hash();

  for ( auto & edge : _adjacency_list )
     tmp += std::hash<std::size_t>()( edge.first->Hash() + edge.second->Hash() );

  _hash = std::hash<std::size_t>()( tmp );

  VALGRIND_CHECK_MEM_IS_DEFINED ( _hash, sizeof(std::size_t) );

  return _hash;
}

Фактическая линия нарушения, из которой происходит отверстие shebang:

std::stringstream hash;
hash << graph->Hash();

Я знаю, что инициализирован и хорошо.

Что это значит?

Если я правильно понимаю, что это предупреждение о том, что байты могут быть потеряны?

Является ли это ложным положительным, или я пропускаю что-то еще?

  • 2
    tmp неинициализирован, а не hash .
Теги:
valgrind

1 ответ

3
Лучший ответ
std::size_t makeHash ( )
{
  std::size_t tmp;

  for ( auto & concept : _concepts )
     tmp += concept->Hash();

Вы добавляете к tmp, но его начальное значение не указано.

  • 0
    Так что для любой неинициализированной локальной переменной я буду получать эти предупреждения? Или то же самое распространяется?
  • 2
    @ Алекс это хорошее предупреждение. Вы можете иметь int tmp; а затем позже tmp=somevalue; и это нормально. Пока вы инициализируете это перед прочтением. tmp+=x - это то же самое, что и tmp = tmp + x левой стороны от tmp все в порядке, tmp с правой стороны считывает единичное значение и имеет неопределенное поведение, не делайте этого.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню