Boost C++ Libraries: Ticket #1714: crash due to new shared_from_this code https://svn.boost.org/trac10/ticket/1714 <p> The following crash is generated by </p> <pre class="wiki">cd libs/python/test bjam andreas_beyer </pre><p> backtrace: </p> <pre class="wiki">&gt; andreas_beyer_ext.pyd!shared_ptr&lt;const void&gt;::operator=() + 0xf bytes C++ andreas_beyer_ext.pyd!sp_deleter_wrapper::set_deleter(const boost::shared_ptr&lt;const void&gt; &amp; deleter={...}) Line 645 C++ andreas_beyer_ext.pyd!enable_shared_from_this&lt;A&gt;::_internal_accept_owner(boost::shared_ptr&lt;boost::enable_shared_from_this&lt;A&gt;::_internal_element_type&gt; &amp; owner={...}) Line 97 + 0x59 bytes C++ andreas_beyer_ext.pyd!boost::detail::sp_enable_shared_from_this(boost::shared_ptr&lt;boost::enable_shared_from_this&lt;A&gt;::_internal_element_type&gt; * ptr=0x0021f47c, const boost::enable_shared_from_this&lt;A&gt; * pe=0x00986a78) Line 102 C++ andreas_beyer_ext.pyd!_internal_element_type&gt;::shared_ptr(A * p=0x00986a78, boost::python::converter::shared_ptr_deleter d={...}) Line 192 + 0x15 bytes C++ andreas_beyer_ext.pyd!shared_ptr_from_python&lt;A&gt;::construct(_object * const source=0x00a81f70, boost::python::converter::rvalue_from_python_stage1_data * data=0x0021f474) Line 50 + 0x7 bytes C++ boost_python-iw-mt-gd-1_35.dll!boost::python::converter::rvalue_from_python_stage2(_object * source=0x00a81f70, boost::python::converter::rvalue_from_python_stage1_data &amp; data={...}, const boost::python::converter::registration &amp; converters={...}) Line 112 + 0x18 bytes C++ andreas_beyer_ext.pyd!_internal_element_type&gt; &gt;::operator()() Line 186 + 0x26 bytes C++ andreas_beyer_ext.pyd!_internal_element_type&gt; &gt;::operator const boost::shared_ptr&lt;A&gt; &amp;() Line 138 + 0xa bytes C++ andreas_beyer_ext.pyd!hold_python(boost::shared_ptr&lt;boost::enable_shared_from_this&lt;A&gt;::_internal_element_type&gt; &amp; x={...}) Line 40 + 0x74 bytes C++ andreas_beyer_ext.pyd!get_b_a(boost::shared_ptr&lt;B&gt; b={...}) Line 45 + 0x19 bytes C++ andreas_beyer_ext.pyd!boost::python::detail::invoke(const boost::python::to_python_value&lt;boost::mpl::if_&lt;boost::python::detail::copy_ctor_mutates_rhs&lt;boost::shared_ptr&lt;boost::enable_shared_from_this&lt;A&gt;::_internal_element_type&gt; &gt;, boost::unwrap_reference&lt;boost::shared_ptr&lt;boost::enable_shared_from_this&lt;A&gt;::_internal_element_type&gt; &gt;::type, boost::add_reference&lt;boost::add_const&lt;boost::unwrap_reference&lt;boost::shared_ptr&lt;boost::enable_shared_from_this&lt;A&gt;::_internal_element_type&gt; &gt;::type&gt;::type&gt;::type&gt;::type&gt; &amp; rc={...}, boost::shared_ptr&lt;boost::enable_shared_from_this&lt;A&gt;::_internal_element_type&gt; * (boost::shared_ptr&lt;boost::enable_shared_from_this&lt;A&gt;::_internal_element_type&gt; *, boost::shared_ptr&lt;B&gt;)* &amp; f=0x1000189d, boost::python::arg_from_python&lt;boost::mpl::v_iter&lt;boost::mpl::vector2&lt;A::A_ptr, boost::shared_ptr&lt;B&gt; &gt;::type, 1L&gt;::type&gt; &amp; ac0={...}) Line 75 + 0x30 bytes C++ andreas_beyer_ext.pyd!oost::mpl::and_&lt;boost::mpl::not_&lt;boost::is_same&lt;const boost::python::detail::not_specified &amp;, boost::mpl::_1&gt; &gt;, boost::detail::indirect_traits::is_reference_to_class&lt;boost::mpl::_1&gt;, boost::mpl::not_&lt;boost::python::detail::is_reference_to_keywords&lt;boost::mpl::_1&gt; &gt;, boost::mpl::true_, boost::mpl::true_&gt;, boost::mpl::void_&gt;::type&gt;::result_type, boost::mpl::vector2&lt;A::A_ptr, boost::shared_ptr&lt;B&gt; &gt; &gt;::operator()(_object * const args_=0x00ba0790, boost::python::detail::caller_arity&lt;1U&gt;::impl&lt;A::A_ptr *(*)(A::A_ptr *, boost::shared_ptr&lt;B&gt;), boost::python::detail::tuple_extract_impl&lt;false&gt;::apply&lt;boost::python::detail::def_helper&lt;const char *, boost::python::detail::not_specified, boost::python::detail::not_specified, boost::python::detail::not_specified&gt;::all_t, boost::mpl::lambda&lt;boost::mpl::and_&lt;boost::mpl::not_&lt;boost::is_same&lt;const boost::python::detail::not_specified &amp;, boost::mpl::_1&gt; &gt;, boost::detail::indirect_traits::is_reference_to_class&lt;boost::mpl::_1&gt;, boost::mpl::not_&lt;boost::python::detail::is_reference_to_keywords&lt;boost::mpl::_1&gt; &gt;, boost::mpl::true_, boost::mpl::true_&gt;, boost::mpl::void_&gt;::type&gt;::result_type, boost::mpl::vector2&lt;A::A_ptr, boost::shared_ptr&lt;B&gt; &gt; &gt; * this=0x009869f4) Line 218 + 0x5 bytes C++ andreas_beyer_ext.pyd!st::mpl::and_&lt;boost::mpl::not_&lt;boost::is_same&lt;const boost::python::detail::not_specified &amp;, boost::mpl::_1&gt; &gt;, boost::detail::indirect_traits::is_reference_to_class&lt;boost::mpl::_1&gt;, boost::mpl::not_&lt;boost::python::detail::is_reference_to_keywords&lt;boost::mpl::_1&gt; &gt;, boost::mpl::true_, boost::mpl::true_&gt;, boost::mpl::void_&gt;::type&gt;::result_type, boost::mpl::vector2&lt;A::A_ptr, boost::shared_ptr&lt;B&gt; &gt; &gt; &gt;::operator()(_object * const args=0x00ba0790, _object * const kw=0x00000000) Line 38 + 0x1d bytes C++ boost_python-iw-mt-gd-1_35.dll!py_function::operator()(_object * args=0x00ba0790, _object * kw=0x00000000) Line 143 + 0x32 bytes C++ boost_python-iw-mt-gd-1_35.dll!function::call(_object * args=0x00ba0790, _object * keywords=0x00000000) Line 226 + 0x47 bytes C++ boost_python-iw-mt-gd-1_35.dll!bind_return::operator()() Line 581 + 0x23 bytes C++ boost_python-iw-mt-gd-1_35.dll!objects::?%546a76fe::bind_return&gt;::type, void&gt;::invoke(boost::detail::function::function_buffer &amp; function_obj_ptr={...}) Line 194 C++ boost_python-iw-mt-gd-1_35.dll! &gt;::operator()() Line 824 + 0x2 bytes C++ boost_python-iw-mt-gd-1_35.dll!boost::python::handle_exception_impl(boost::function0&lt;void, std::allocator&lt;boost::function_base&gt; &gt; f={...}) Line 25 + 0xa bytes C++ boost_python-iw-mt-gd-1_35.dll!boost::python::handle_exception(boost::python::objects::?%546a76fe::bind_return f={...}) Line 29 + 0x3a bytes C++ boost_python-iw-mt-gd-1_35.dll!boost::python::objects::function_call(_object * const func=0x00986a28, _object * const args=0x00ba0790, _object * const kw=0x00000000) Line 613 + 0x49 bytes C++ python25.dll!1e0266dc() [Frames below may be incorrect and/or missing, no symbols loaded for python25.dll] python25.dll!1e039e6d() python25.dll!1e03ae12() python25.dll!1e03cdca() python25.dll!1e07090e() python25.dll!1e03dcdd() python25.dll!1e03dd42() python25.dll!1e03dfab() python25.dll!1e03c1ab() python25.dll!1e0709f2() python25.dll!1e03dcdd() python25.dll!1e039bfc() python25.dll!1e03ae02() python25.dll!1e03cdca() python25.dll!1e07090e() python25.dll!1e03dcdd() python25.dll!1e039bfc() python25.dll!1e03ae02() python25.dll!1e03cdca() python25.dll!1e07090e() python25.dll!1e03dcdd() python25.dll!1e039bfc() python25.dll!1e03ae02() python25.dll!1e03cdca() python25.dll!1e07090e() python25.dll!1e03dcdd() python25.dll!1e039bfc() python25.dll!1e03ae02() python25.dll!1e03c5c1() python25.dll!1e03cdca() python25.dll!1e07090e() python25.dll!1e03dcdd() python25.dll!1e0818ab() python25.dll!1e03dd42() python25.dll!1e0ab00a() python25.dll!1e0abf86() python25.dll!1e0ac65d() msvcr71.dll!7c38a87e() python25.dll!1e0acc6a() python25.dll!1e08a396() python.exe!1d0011a5() kernel32.dll!7c816fd7() </pre> en-us Boost C++ Libraries /htdocs/site/boost.png https://svn.boost.org/trac10/ticket/1714 Trac 1.4.3 Peter Dimov Tue, 25 Mar 2008 15:12:23 GMT cc set https://svn.boost.org/trac10/ticket/1714#comment:1 https://svn.boost.org/trac10/ticket/1714#comment:1 <ul> <li><strong>cc</strong> <span class="trac-author">Peter Dimov</span> added </li> </ul> <p> This is likely caused by the fact that _internal_accept_owner doesn't check whether _owned isn't already true. The following simpler test also crashes: </p> <pre class="wiki">#include &lt;boost/shared_ptr.hpp&gt; #include &lt;boost/enable_shared_from_this.hpp&gt; struct X: public boost::enable_shared_from_this&lt; X &gt; { }; struct null_deleter { void operator()( void const* ) const { } }; int main() { boost::shared_ptr&lt;X&gt; px( new X ); boost::shared_ptr&lt;X&gt; px2( px.get(), null_deleter() ); } </pre> Ticket Dave Abrahams Tue, 25 Mar 2008 15:46:33 GMT attachment set https://svn.boost.org/trac10/ticket/1714 https://svn.boost.org/trac10/ticket/1714 <ul> <li><strong>attachment</strong> → <span class="trac-field-new">enable_shared_from_this.patch</span> </li> </ul> <p> This appears to fix the bug but I have no idea if the logic is right. </p> Ticket Peter Dimov Tue, 25 Mar 2008 15:48:44 GMT <link>https://svn.boost.org/trac10/ticket/1714#comment:2 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/1714#comment:2</guid> <description> <p> I checked in a fix: <a class="changeset" href="https://svn.boost.org/trac10/changeset/43856" title="_internal_accept_owner now checks if _owned isn't already true.">[43856]</a> </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Dave Abrahams</dc:creator> <pubDate>Tue, 25 Mar 2008 16:05:15 GMT</pubDate> <title>status changed; resolution set https://svn.boost.org/trac10/ticket/1714#comment:3 https://svn.boost.org/trac10/ticket/1714#comment:3 <ul> <li><strong>status</strong> <span class="trac-field-old">new</span> → <span class="trac-field-new">closed</span> </li> <li><strong>resolution</strong> → <span class="trac-field-new">fixed</span> </li> </ul> <p> it works! </p> Ticket