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-19 03:42:47


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.

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