Weird (memory-related?) error

Issue #179 resolved
Frank Dellaert created an issue

@cbeall3

Could you run testBasisDecompositions.run for me with your memory analyzer? All tests succeed, but when I tried to move the file to a different project (doubleExpresso) the exact same test failed in places, and in weird ways.

Maybe we only have an error when linking from a different project?

F

Comments (2)

  1. Chris Beall

    This fails for me in Debug mode, TBB off:

    157/189 Test #157: testBasisDecompositions ................***Failed    0.01 sec
    Not equal:
    expected:
    
      A[1] = [ 1 1 0 ]
      b = [ 2.71828 ]
      No noise model
    actual:
    
      A[1] = [ 1 1 0 ]
      b = [ 1.71828 ]
      No noise model
    /home/cbeall3/git/gtsam/gtsam_unstable/nonlinear/tests/testBasisDecompositions.cpp:170: Failure: "assert_equal(f1, *jf, 1e-9)" 
    

    b is always wrong. Partial valgrind output suggesting uninitialized variable:

    cbeall3@cbeall3-desktop:~/git/gtsam/build-Debug/gtsam_unstable/nonlinear/tests$ valgrind --track-origins=yes ./testBasisDecompositions
    ==6619== Memcheck, a memory error detector
    ==6619== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
    ==6619== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
    ==6619== Command: ./testBasisDecompositions
    ==6619== 
    ==6619== Conditional jump or move depends on uninitialised value(s)
    ==6619==    at 0x5B2419D: bool gtsam::equal_with_abs_tol<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> >(Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, double) (Matrix.h:111)
    ==6619==    by 0x5B1D529: gtsam::JacobianFactor::equals(gtsam::GaussianFactor const&, double) const (JacobianFactor.cpp:391)
    ==6619==    by 0x4C6FE9: bool gtsam::assert_equal<gtsam::JacobianFactor>(gtsam::JacobianFactor const&, gtsam::JacobianFactor const&, double) (Testable.h:90)
    ==6619==    by 0x4BE407: gtsam::internal::testFactorJacobians(TestResult&, std::string const&, gtsam::NoiseModelFactor const&, gtsam::Values const&, double, double) (expressionTesting.h:91)
    ==6619==    by 0x4C7C99: void gtsam::internal::testExpressionJacobians<double>(TestResult&, std::string const&, gtsam::Expression<double> const&, gtsam::Values const&, double, double) (expressionTesting.h:113)
    ==6619==    by 0x4BF0E2: BasisDecompositionsManualFourierTest::run(TestResult&) (testBasisDecompositions.cpp:164)
    ==6619==    by 0x4FA2CF: TestRegistry::run(TestResult&) (TestRegistry.cpp:62)
    ==6619==    by 0x4FA1CB: TestRegistry::runAllTests(TestResult&) (TestRegistry.cpp:29)
    ==6619==    by 0x4BFC81: main (testBasisDecompositions.cpp:202)
    ==6619==  Uninitialised value was created by a stack allocation
    ==6619==    at 0x4BED1D: BasisDecompositionsManualFourierTest::run(TestResult&) (testBasisDecompositions.cpp:143)
    ==6619== 
    ==6619== Conditional jump or move depends on uninitialised value(s)
    ==6619==    at 0x5B241FF: bool gtsam::equal_with_abs_tol<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> >(Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, double) (Matrix.h:113)
    ==6619==    by 0x5B1D529: gtsam::JacobianFactor::equals(gtsam::GaussianFactor const&, double) const (JacobianFactor.cpp:391)
    ==6619==    by 0x4C6FE9: bool gtsam::assert_equal<gtsam::JacobianFactor>(gtsam::JacobianFactor const&, gtsam::JacobianFactor const&, double) (Testable.h:90)
    ==6619==    by 0x4BE407: gtsam::internal::testFactorJacobians(TestResult&, std::string const&, gtsam::NoiseModelFactor const&, gtsam::Values const&, double, double) (expressionTesting.h:91)
    ==6619==    by 0x4C7C99: void gtsam::internal::testExpressionJacobians<double>(TestResult&, std::string const&, gtsam::Expression<double> const&, gtsam::Values const&, double, double) (expressionTesting.h:113)
    ==6619==    by 0x4BF0E2: BasisDecompositionsManualFourierTest::run(TestResult&) (testBasisDecompositions.cpp:164)
    ==6619==    by 0x4FA2CF: TestRegistry::run(TestResult&) (TestRegistry.cpp:62)
    ==6619==    by 0x4FA1CB: TestRegistry::runAllTests(TestResult&) (TestRegistry.cpp:29)
    ==6619==    by 0x4BFC81: main (testBasisDecompositions.cpp:202)
    ==6619==  Uninitialised value was created by a stack allocation
    ==6619==    at 0x4BED1D: BasisDecompositionsManualFourierTest::run(TestResult&) (testBasisDecompositions.cpp:143)
    ==6619== 
    ==6619== Conditional jump or move depends on uninitialised value(s)
    ==6619==    at 0x5B2419D: bool gtsam::equal_with_abs_tol<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> >(Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, double) (Matrix.h:111)
    ==6619==    by 0x5B1D529: gtsam::JacobianFactor::equals(gtsam::GaussianFactor const&, double) const (JacobianFactor.cpp:391)
    ==6619==    by 0x4C6FE9: bool gtsam::assert_equal<gtsam::JacobianFactor>(gtsam::JacobianFactor const&, gtsam::JacobianFactor const&, double) (Testable.h:90)
    ==6619==    by 0x4BF1A3: BasisDecompositionsManualFourierTest::run(TestResult&) (testBasisDecompositions.cpp:170)
    ==6619==    by 0x4FA2CF: TestRegistry::run(TestResult&) (TestRegistry.cpp:62)
    ==6619==    by 0x4FA1CB: TestRegistry::runAllTests(TestResult&) (TestRegistry.cpp:29)
    ==6619==    by 0x4BFC81: main (testBasisDecompositions.cpp:202)
    ==6619==  Uninitialised value was created by a stack allocation
    ==6619==    at 0x4BED1D: BasisDecompositionsManualFourierTest::run(TestResult&) (testBasisDecompositions.cpp:143)
    ==6619== 
    ==6619== Conditional jump or move depends on uninitialised value(s)
    ==6619==    at 0x5B241FF: bool gtsam::equal_with_abs_tol<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> >(Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, double) (Matrix.h:113)
    ==6619==    by 0x5B1D529: gtsam::JacobianFactor::equals(gtsam::GaussianFactor const&, double) const (JacobianFactor.cpp:391)
    ==6619==    by 0x4C6FE9: bool gtsam::assert_equal<gtsam::JacobianFactor>(gtsam::JacobianFactor const&, gtsam::JacobianFactor const&, double) (Testable.h:90)
    ==6619==    by 0x4BF1A3: BasisDecompositionsManualFourierTest::run(TestResult&) (testBasisDecompositions.cpp:170)
    ==6619==    by 0x4FA2CF: TestRegistry::run(TestResult&) (TestRegistry.cpp:62)
    ==6619==    by 0x4FA1CB: TestRegistry::runAllTests(TestResult&) (TestRegistry.cpp:29)
    ==6619==    by 0x4BFC81: main (testBasisDecompositions.cpp:202)
    ==6619==  Uninitialised value was created by a stack allocation
    ==6619==    at 0x4BED1D: BasisDecompositionsManualFourierTest::run(TestResult&) (testBasisDecompositions.cpp:143)
    ==6619== 
    Not equal:
    expected:
    
      A[1] = [ 1 1 0 ]
      b = [ 2.71828 ]
      No noise model
    actual:
    
      A[1] = [ 1 1 0 ]
    ==6619== Conditional jump or move depends on uninitialised value(s)
    ==6619==    at 0x6D0A3D7: __printf_fp (printf_fp.c:400)
    ==6619==    by 0x6D09682: vfprintf (vfprintf.c:1660)
    ==6619==    by 0x6D2DFF8: vsnprintf (vsnprintf.c:119)
    ==6619==    by 0x651EFAF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
    ==6619==    by 0x6525423: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
    ==6619==    by 0x652570F: 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, double) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
    ==6619==    by 0x6530CA4: std::ostream& std::ostream::_M_insert<double>(double) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
    ==6619==    by 0x58EBBCF: std::ostream& Eigen::internal::print_matrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::ostream&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::IOFormat const&) (IO.h:200)
    ==6619==    by 0x58EA686: std::ostream& Eigen::operator<< <Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::ostream&, Eigen::DenseBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&) (IO.h:245)
    ==6619==    by 0x591459D: gtsam::formatMatrixIndented(std::string const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, bool) (Matrix.cpp:697)
    ==6619==    by 0x5B1CF76: gtsam::JacobianFactor::print(std::string const&, boost::function<std::string (unsigned long)> const&) const (JacobianFactor.cpp:358)
    ==6619==    by 0x4C70A1: bool gtsam::assert_equal<gtsam::JacobianFactor>(gtsam::JacobianFactor const&, gtsam::JacobianFactor const&, double) (Testable.h:94)
    ==6619==  Uninitialised value was created by a stack allocation
    ==6619==    at 0x4BED1D: BasisDecompositionsManualFourierTest::run(TestResult&) (testBasisDecompositions.cpp:143)
    ==6619== 
    

    testExpressionFactor doesn't run valgrind-clean either, but the test always passes:

    cbeall3@cbeall3-desktop:~/git/gtsam/build-Debug/gtsam_unstable/nonlinear/tests$ valgrind --track-origins=yes ./testExpressionFactor
    ==6772== Memcheck, a memory error detector
    ==6772== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
    ==6772== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
    ==6772== Command: ./testExpressionFactor
    ==6772== 
    ==6772== Conditional jump or move depends on uninitialised value(s)
    ==6772==    at 0x5B2419D: bool gtsam::equal_with_abs_tol<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> >(Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, double) (Matrix.h:111)
    ==6772==    by 0x5B1D529: gtsam::JacobianFactor::equals(gtsam::GaussianFactor const&, double) const (JacobianFactor.cpp:391)
    ==6772==    by 0x6DF849: bool gtsam::assert_equal<gtsam::JacobianFactor>(gtsam::JacobianFactor const&, gtsam::JacobianFactor const&, double) (Testable.h:90)
    ==6772==    by 0x6C9C05: gtsam::internal::testFactorJacobians(TestResult&, std::string const&, gtsam::NoiseModelFactor const&, gtsam::Values const&, double, double) (expressionTesting.h:91)
    ==6772==    by 0x6CC2B1: ExpressionFactorWideTest::run(TestResult&) (testExpressionFactor.cpp:155)
    ==6772==    by 0x79E38B: TestRegistry::run(TestResult&) (TestRegistry.cpp:62)
    ==6772==    by 0x79E287: TestRegistry::runAllTests(TestResult&) (TestRegistry.cpp:29)
    ==6772==    by 0x6D5921: main (testExpressionFactor.cpp:499)
    ==6772==  Uninitialised value was created by a stack allocation
    ==6772==    at 0x6CC119: ExpressionFactorWideTest::run(TestResult&) (testExpressionFactor.cpp:145)
    ==6772== 
    ==6772== Conditional jump or move depends on uninitialised value(s)
    ==6772==    at 0x5B241FF: bool gtsam::equal_with_abs_tol<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> >(Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, Eigen::DenseBase<Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1, -1, false>, 1, -1, false> > const&, double) (Matrix.h:113)
    ==6772==    by 0x5B1D529: gtsam::JacobianFactor::equals(gtsam::GaussianFactor const&, double) const (JacobianFactor.cpp:391)
    ==6772==    by 0x6DF849: bool gtsam::assert_equal<gtsam::JacobianFactor>(gtsam::JacobianFactor const&, gtsam::JacobianFactor const&, double) (Testable.h:90)
    ==6772==    by 0x6C9C05: gtsam::internal::testFactorJacobians(TestResult&, std::string const&, gtsam::NoiseModelFactor const&, gtsam::Values const&, double, double) (expressionTesting.h:91)
    ==6772==    by 0x6CC2B1: ExpressionFactorWideTest::run(TestResult&) (testExpressionFactor.cpp:155)
    ==6772==    by 0x79E38B: TestRegistry::run(TestResult&) (TestRegistry.cpp:62)
    ==6772==    by 0x79E287: TestRegistry::runAllTests(TestResult&) (TestRegistry.cpp:29)
    ==6772==    by 0x6D5921: main (testExpressionFactor.cpp:499)
    ==6772==  Uninitialised value was created by a stack allocation
    ==6772==    at 0x6CC119: ExpressionFactorWideTest::run(TestResult&) (testExpressionFactor.cpp:145)
    ==6772== 
    There were no test failures
    ==6772== 
    ==6772== HEAP SUMMARY:
    ==6772==     in use at exit: 11,360 bytes in 6 blocks
    ==6772==   total heap usage: 1,485 allocs, 1,479 frees, 78,191 bytes allocated
    ==6772== 
    ==6772== LEAK SUMMARY:
    ==6772==    definitely lost: 0 bytes in 0 blocks
    ==6772==    indirectly lost: 0 bytes in 0 blocks
    ==6772==      possibly lost: 0 bytes in 0 blocks
    ==6772==    still reachable: 11,360 bytes in 6 blocks
    ==6772==         suppressed: 0 bytes in 0 blocks
    ==6772== Rerun with --leak-check=full to see details of leaked memory
    ==6772== 
    ==6772== For counts of detected and suppressed errors, rerun with: -v
    ==6772== ERROR SUMMARY: 144 errors from 2 contexts (suppressed: 0 from 0)
    

    testExpression, where we had problems recently, runs cleanly.

  2. Log in to comment