Hi Folks
I've been tracking down some almost-certainly-false-positives from
Valgrind. Consider the following code:
#include <iostream>
#include
#include
using namespace std;
using boost::make_shared;
struct StateSpace {
public:
StateSpace(int spaceType) {
if (spaceType == 4)
cout << "Some Output" << endl;
}
};
class State {
public:
State() : m_rep(make_shared<StateSpace>(0) ) {}
boost::shared_ptr<StateSpace> m_rep;
};
int main() {
State state;
}
Valgrind 3.6 reports this:
==8198== Memcheck, a memory error detector
==8198== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==8198== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for
copyright info
==8198== Command: testState
==8198==
==8198== Conditional jump or move depends on uninitialised value(s)
==8198== at 0x401659: StateSpace::StateSpace(int) (testState.cpp:14)
==8198== by 0x401796: boost::shared_ptr<StateSpace>
boost::make_shared(int&&, ) (make_shared.hpp:150)
==8198== by 0x4016BD: State::State() (testState.cpp:22)
==8198== by 0x401317: main (testState.cpp:29)
==8198==
==8198==
==8198== HEAP SUMMARY:
==8198== in use at exit: 464 bytes in 5 blocks
==8198== total heap usage: 240 allocs, 236 frees, 45,162 bytes allocated
==8198==
==8198== LEAK SUMMARY:
==8198== definitely lost: 0 bytes in 0 blocks
==8198== indirectly lost: 0 bytes in 0 blocks
==8198== possibly lost: 0 bytes in 0 blocks
==8198== still reachable: 464 bytes in 5 blocks
==8198== suppressed: 0 bytes in 0 blocks
==8198== Reachable blocks (those to which a pointer was found) are not shown.
==8198== To see them, rerun with: --leak-check=full --show-reachable=yes
==8198==
==8198== For counts of detected and suppressed errors, rerun with: -v
==8198== Use --track-origins=yes to see where uninitialised values come from
==8198== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 5 from 5)
Interestingly, if I change
State() : m_rep(make_shared<StateSpace>(0) ) {}
to
State() : m_rep(new StateSpace(0)) {}
the Valgrind error goes away.
This is, of course, a greatly boiled-down version of our actual code,
which we're very confident works correctly. Any ideas about why
Valgrind doesn't like the call to make_shared? Any ideas about how to
silence this warning (other than adding it to Valgrind's suppressions
file)?
Thanks very much.
--
Dave Steffen, Ph.D. - Software Engineer
Numerica Corporation http://www.numerica.us
4850 Hahns Peak Drive, Suite 200
Loveland, Colorado 80538
main (970) 461-2000 x 227 direct (970) 612-2327
Email: dave.steffen@numerica.us
fax (970) 461-2004