Opened 15 years ago
Closed 15 years ago
#1714 closed Bugs (fixed)
crash due to new shared_from_this code
Reported by: | Dave Abrahams | Owned by: | Frank Mori Hess |
---|---|---|---|
Milestone: | Boost 1.36.0 | Component: | smart_ptr |
Version: | Boost Development Trunk | Severity: | Regression |
Keywords: | Cc: | Peter Dimov |
Description
The following crash is generated by
cd libs/python/test bjam andreas_beyer
backtrace:
> andreas_beyer_ext.pyd!shared_ptr<const void>::operator=() + 0xf bytes C++ andreas_beyer_ext.pyd!sp_deleter_wrapper::set_deleter(const boost::shared_ptr<const void> & deleter={...}) Line 645 C++ andreas_beyer_ext.pyd!enable_shared_from_this<A>::_internal_accept_owner(boost::shared_ptr<boost::enable_shared_from_this<A>::_internal_element_type> & owner={...}) Line 97 + 0x59 bytes C++ andreas_beyer_ext.pyd!boost::detail::sp_enable_shared_from_this(boost::shared_ptr<boost::enable_shared_from_this<A>::_internal_element_type> * ptr=0x0021f47c, const boost::enable_shared_from_this<A> * pe=0x00986a78) Line 102 C++ andreas_beyer_ext.pyd!_internal_element_type>::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<A>::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 & data={...}, const boost::python::converter::registration & converters={...}) Line 112 + 0x18 bytes C++ andreas_beyer_ext.pyd!_internal_element_type> >::operator()() Line 186 + 0x26 bytes C++ andreas_beyer_ext.pyd!_internal_element_type> >::operator const boost::shared_ptr<A> &() Line 138 + 0xa bytes C++ andreas_beyer_ext.pyd!hold_python(boost::shared_ptr<boost::enable_shared_from_this<A>::_internal_element_type> & x={...}) Line 40 + 0x74 bytes C++ andreas_beyer_ext.pyd!get_b_a(boost::shared_ptr<B> b={...}) Line 45 + 0x19 bytes C++ andreas_beyer_ext.pyd!boost::python::detail::invoke(const boost::python::to_python_value<boost::mpl::if_<boost::python::detail::copy_ctor_mutates_rhs<boost::shared_ptr<boost::enable_shared_from_this<A>::_internal_element_type> >, boost::unwrap_reference<boost::shared_ptr<boost::enable_shared_from_this<A>::_internal_element_type> >::type, boost::add_reference<boost::add_const<boost::unwrap_reference<boost::shared_ptr<boost::enable_shared_from_this<A>::_internal_element_type> >::type>::type>::type>::type> & rc={...}, boost::shared_ptr<boost::enable_shared_from_this<A>::_internal_element_type> * (boost::shared_ptr<boost::enable_shared_from_this<A>::_internal_element_type> *, boost::shared_ptr<B>)* & f=0x1000189d, boost::python::arg_from_python<boost::mpl::v_iter<boost::mpl::vector2<A::A_ptr, boost::shared_ptr<B> >::type, 1L>::type> & ac0={...}) Line 75 + 0x30 bytes C++ andreas_beyer_ext.pyd!oost::mpl::and_<boost::mpl::not_<boost::is_same<const boost::python::detail::not_specified &, boost::mpl::_1> >, boost::detail::indirect_traits::is_reference_to_class<boost::mpl::_1>, boost::mpl::not_<boost::python::detail::is_reference_to_keywords<boost::mpl::_1> >, boost::mpl::true_, boost::mpl::true_>, boost::mpl::void_>::type>::result_type, boost::mpl::vector2<A::A_ptr, boost::shared_ptr<B> > >::operator()(_object * const args_=0x00ba0790, boost::python::detail::caller_arity<1U>::impl<A::A_ptr *(*)(A::A_ptr *, boost::shared_ptr<B>), boost::python::detail::tuple_extract_impl<false>::apply<boost::python::detail::def_helper<const char *, boost::python::detail::not_specified, boost::python::detail::not_specified, boost::python::detail::not_specified>::all_t, boost::mpl::lambda<boost::mpl::and_<boost::mpl::not_<boost::is_same<const boost::python::detail::not_specified &, boost::mpl::_1> >, boost::detail::indirect_traits::is_reference_to_class<boost::mpl::_1>, boost::mpl::not_<boost::python::detail::is_reference_to_keywords<boost::mpl::_1> >, boost::mpl::true_, boost::mpl::true_>, boost::mpl::void_>::type>::result_type, boost::mpl::vector2<A::A_ptr, boost::shared_ptr<B> > > * this=0x009869f4) Line 218 + 0x5 bytes C++ andreas_beyer_ext.pyd!st::mpl::and_<boost::mpl::not_<boost::is_same<const boost::python::detail::not_specified &, boost::mpl::_1> >, boost::detail::indirect_traits::is_reference_to_class<boost::mpl::_1>, boost::mpl::not_<boost::python::detail::is_reference_to_keywords<boost::mpl::_1> >, boost::mpl::true_, boost::mpl::true_>, boost::mpl::void_>::type>::result_type, boost::mpl::vector2<A::A_ptr, boost::shared_ptr<B> > > >::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>::type, void>::invoke(boost::detail::function::function_buffer & function_obj_ptr={...}) Line 194 C++ boost_python-iw-mt-gd-1_35.dll! >::operator()() Line 824 + 0x2 bytes C++ boost_python-iw-mt-gd-1_35.dll!boost::python::handle_exception_impl(boost::function0<void, std::allocator<boost::function_base> > 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()
Attachments (1)
Change History (4)
comment:1 by , 15 years ago
Cc: | added |
---|
by , 15 years ago
Attachment: | enable_shared_from_this.patch added |
---|
This appears to fix the bug but I have no idea if the logic is right.
Note:
See TracTickets
for help on using tickets.
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: