Boost logo

Boost Users :

Subject: Re: [Boost-users] [test] Malloc exceptions when using test framework on 64bit OS X 10.6.1
From: Peter Klotz (peter.klotz_at_[hidden])
Date: 2009-09-21 16:06:01


Rush Manbert wrote:
>
> On Sep 19, 2009, at 12:42 AM, Peter Klotz wrote:
>
>> Rush Manbert wrote:
>>> On Sep 18, 2009, at 4:57 PM, Rush Manbert wrote:
>>>>
>>>> On Sep 17, 2009, at 1:02 AM, Vrai Stacey wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I've been making my first forays in to using Boost on the new OS X
>>>>> release and have encountered some strange behaviour on 64bit machines.
>>>>> Testing with Boost 1.37.0 and 1.40.0 I've found that everything
>>>>> compiles as expected, but attempting to run any unit tests results in
>>>>> an error of the form:
>>>>>
>>>>> *** No errors detected
>>>>> test_exceptions(92517) malloc: *** error for object 0x3000100200460:
>>>>> pointer being freed was not allocated
>>>>> *** set a breakpoint in malloc_error_break to debug
>>>>>
>>>> <snip>
>>>>
>>>> I am seeing the same thing using Boost 1.38.0 built for 64-bit Intel
>>>> on OS X 10.6.1. The test program worked fine on OS X 10.5.7, but I'm
>>>> seeing the same malloc errors as you.
>>>>
>>>> For me, the error occurs in the file framework.ipp:
>>>>
>>>> class framework_impl : public test_tree_visitor {
>>>> public:
>>>> framework_impl()
>>>> : m_master_test_suite( 0 )
>>>> , m_curr_test_case( INV_TEST_UNIT_ID )
>>>> , m_next_test_case_id( MIN_TEST_CASE_ID )
>>>> , m_next_test_suite_id( MIN_TEST_SUITE_ID )
>>>> , m_is_initialized( false )
>>>> , m_test_in_progress( false )
>>>> {}
>>>>
>>>> ~framework_impl() { clear(); }
>>>>
>>>>
>>>> void clear()
>>>> {
>>>> while( !m_test_units.empty() ) {
>>>> test_unit_store::value_type const& tu =
>>>> *m_test_units.begin();
>>>>
>>>> // the delete will erase this element from map
>>>> if( test_id_2_unit_type( tu.second->p_id ) == tut_suite )
>>>> delete (test_suite const*)tu.second;
>>>> else
>>>> delete (test_case const*)tu.second;
>>>> <<<<------------------------- This statement generates the error
>>>> }
>>>> }
>>>>
>>>> GDB won't let me put a breakpoint anywhere in this file. Maybe I can
>>>> hack it to see something...
>>> Okay, I was able to debug it by doing this:
>>> The main unit test file is called UnitTestMain.cpp, and just includes
>>> <boost/test/included/unit_test.hpp>, and that file includes all of
>>> the *.ipp files.
>>> I preprocessed UnitTestMain.cpp in Xcode and deleted all of the
>>> preprocessor lines with sed:
>>> sed '/^#/ d' <UnitTestMain.ii >UnitTestMain.cpp
>>> and I substituted the new UnitTestMain.cpp (the preprocessed file)
>>> for the original one.
>>> After that I could set a breakpoint in
>>> framework_impl::register_test_unit(). What I see is that the test
>>> case being registered is the "this" pointer from an object that was
>>> created with new, so it looks like the error is a bug in Snow Leopard.
>>> That's about all I know right now. I have never used boost unit test,
>>> so don't really know how to put together a reduced test case that can
>>> be submitted to Apple. Any takers? :-)
>>> - Rush
>>
>>
>> This seems to be once again this bug in Boost.Test:
>>
>> http://www.nabble.com/-Boost.Test--valgrind-complains-about-invalid-reads-td20500154.html
>>
>> http://www.nabble.com/-Boost.Test--Error:-Non-aligned-pointer-being-freed-td24335733.html
>>
>>
>> Try making the test_unit destructor virtual and your problem should be
>> resolved.
>>
>
> Thank you, Peter. That does resolve the problem.
>
> Do you have any idea whether 1.40 still has this problem?
>

Yes, 1.40.0 also suffers from this bug.

Maybe we can finally convince Gennadiy to fix this issue in SVN.

This would stop forcing people to use their own patches each time a new
version of Boost is released.

Regards, Peter.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net