Subject: Re: [Boost-bugs] [Boost C++ Libraries] #5444: boost::pool<>::ordered_malloc() crash
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2011-04-14 17:41:34
#5444: boost::pool<>::ordered_malloc() crash
-----------------------------------+----------------------------------------
Reporter: philippeb8@⦠| Owner: cnewbold
Type: Bugs | Status: closed
Milestone: To Be Determined | Component: pool
Version: Boost 1.43.0 | Severity: Problem
Resolution: invalid | Keywords:
-----------------------------------+----------------------------------------
Changes (by johnmaddock):
* status: new => closed
* resolution: => invalid
Comment:
I can reproduce on MSVC, but this seems to be a bug in shifted_ptr:
The order of operations on pool is:
create pool of block size 1.
Allocate 60 blocks
Allocate 60 blocks
Deallocate 60 blocks
>>>> Corruption of pools internal free list occures here >>>>>
Deallocate 60 blocks.
I set a memory breakpoint on the corrupted pool, and shifted pointer is
changing the value 4 bytes into the already freed memory, with call stack:
scrap.exe!boost::detail::sp_counted_base::release() Line 100 +
0xd bytes C++
scrap.exe!boost::detail::sh::shifted_ptr_common<node>::~shifted_ptr_common<node>()
Line 67 C++
scrap.exe!boost::detail::sh::shifted_ptr_base<node>::~shifted_ptr_base<node>()
+ 0x2b bytes C++
scrap.exe!boost::detail::sh::shifted_ptr<node>::~shifted_ptr<node>() Line
362 + 0xf bytes C++
scrap.exe!node::~node() Line 39 + 0x1a bytes C++
scrap.exe!boost::detail::sh::shifted<node>::~shifted<node>() Line
224 + 0xf bytes C++
> scrap.exe!boost::detail::sh::shifted<node>::`scalar deleting
destructor'() + 0x2b bytes C++
scrap.exe!boost::detail::sh::set::release() Line 99 + 0x39 bytes
C++
scrap.exe!boost::detail::sh::shifted_ptr<node>::release(bool d)
Line 375 + 0xb bytes C++
scrap.exe!boost::detail::sh::shifted_ptr<node>::reset() Line 357
C++
scrap.exe!list::clear() Line 53 C++
scrap.exe!test_shifted_ptr::test_method() Line 99 C++
scrap.exe!test_shifted_ptr_invoker() Line 82 + 0x26 bytes
C++
scrap.exe!boost::unit_test::ut_detail::invoker<boost::unit_test::ut_detail::unused>::invoke<void
(__cdecl*)(void)>(void (void)* & f) Line 56 + 0x2c bytes C++
scrap.exe!boost::unit_test::ut_detail::callback0_impl_t<boost::unit_test::ut_detail::unused,void
(__cdecl*)(void)>::invoke() Line 89 + 0x41 bytes C++
I also noted that:
1) If you're calling ordered_malloc then you should use ordered_free to
free the memory.
2) Using pool(1) to allocate randomly sized blocks is likely to be very
inefficient (worse than malloc/free), it would be much better if each
shifted<T> had it's own pool for sizeof(T) chunks, and could therefore
allocate 1 chunk at a time using the unordered pool interfaces (malloc and
free) as this would be '''much''' more efficient.
3) owned_base has a static pool instance - this is not thread safe - which
is to say pool is not safe for calling from mutiple threads. You could
use singleton_pool<>::malloc/free instead of storing a static pool
instance, and this would then be thread safe.
HTH, John.
PS closing down, please reopen if you really think it's a pool bug, but a
test case involving just pool would be nice ;-)
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/5444#comment:1> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:06 UTC