2013-12-24 3 views
0

내가 인해 다른 다양한 문제에 Valgrind의를 통해 내 응용 프로그램을 실행 봤는데, 나는에 대해 경고를보고 계속 초기화되지 않은 값 (들)에 따라 달라집니다 : 그래서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) 

, 나는 주위를 읽고

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; 
} 

구멍 오두막부터 시작되는 실제 문제가되는 라인은 다음과 같습니다 :

조금, 나는 memcheck를 가져, 특정 메모리 요청을 요청할 수 있다는 것을 발견

내가 알고 있고 초기화되었습니다.

그 의미는 무엇입니까?

정확하게 이해하면 바이트 일 수 있다는 경고가 나옵니까?

거짓 긍정입니까, 아니면 다른 것이 있습니까?

+2

'tmp'는 초기화되지 않습니다. 'hash'가 아닙니다. –

답변

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

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

tmp에 추가 할 수 있지만 초기 값은 지정되지 않습니다.

+0

초기화되지 않은 지역 변수에 대해서는 계속 경고 메시지를 표시하겠습니까? 아니면 같은 전파합니까? –

+2

@Alex 경고가 좋습니다. 'int tmp;'그리고 나서'tmp = somevalue;'를 쓸 수 있으며 괜찮습니다. 읽기 전에 초기화하십시오. 'tmp + = x'는'tmp = tmp + x'와 같습니다. 왼쪽의'tmp'는 ok입니다. 오른쪽의'tmp'는 단위 화 된 값을 읽어서 정의되지 않은 동작입니다. 이러지 마. –

+0

네, 설명해 주셔서 감사합니다. 그 경고가 수없이 많아서 그게 왜 유용한지 이해가됩니다. –