Boost logo

Boost :

From: SourceForge.net (noreply_at_[hidden])
Date: 2005-08-17 08:31:27


Bugs item #1262084, was opened at 2005-08-17 06:31
Message generated for change (Tracker Item Submitted) made by Item Submitter
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=107586&aid=1262084&group_id=7586

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: serialization
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Nobody/Anonymous (nobody)
Assigned to: Robert Ramey (ramey)
Summary: crash deserializing 1.32 data (poly archive + stl container)

Initial Comment:
Hello,

i got a problem deserializing STL containers with
polymorphic archive interfaces.

Serialization/Deserialization with boost 1.32 works fine.
Simple object trees with stl containers (maps) and base
class registration (no shared_ptr used).

When i deserialize the data (xml) with boost 1.33 it
asserts/crashes in basic_iarchive.cpp (
basic_iarchive_impl::reset_object_address):

--- snip ----

inline void
basic_iarchive_impl::reset_object_address(
    const void * new_address,
    const void *old_address
){
    // if the this object wasn't tracked
    std::size_t i = moveable_object_position;
    if(i >= moveable_object_stack.size())
        return;
    if(old_address != object_id_vector[i].address)
        // skip to any lower level ones
        ++i;
    while(i < moveable_object_stack.size()){
        // calculate displacement from this level
        assert(object_id_vector[i].address >=
old_address); <---- assert here !!!
        // warning - pointer arithmetic on void * is in
herently non-portable
        // but expected to work on all platforms in
current usage
        std::size_t member_displacement
            =
reinterpret_cast<std::size_t>(object_id_vector[i].address)
            - reinterpret_cast<std::size_t>(old_address);

---- snip ----

Callstack:

>
ddc.exe!boost::archive::detail::basic_iarchive_impl::reset_object_address(const
void * new_address=0x00fb67cc, const void *
old_address=0x0135c67c) Line 266 + 0x2a C++
 
ddc.exe!boost::archive::detail::basic_iarchive::reset_object_address(const
void * new_address=0x00fb67cc, const void *
old_address=0x0135c67c) Line 530 C++
 
ddc.exe!boost::archive::detail::polymorphic_iarchive_impl<boost::archive::xml_iarchive_impl<boost::archive::xml_iarchive>
>::reset_object_address(const void *
new_address=0x00fb67cc, const void *
old_address=0x0135c67c) Line 78 C++
 
ddc.exe!boost::serialization::stl::archive_input_map<boost::archive::polymorphic_iarchive,std::map<unsigned
int,xxx::LayoutObject *,std::less<unsigned
int>,std::allocator<std::pair<unsigned int const
,xxx::LayoutObject *> > >
>::operator()(boost::archive::polymorphic_iarchive &
ar={...}, std::map<unsigned int,xxx::LayoutObject
*,std::less<unsigned
int>,std::allocator<std::pair<unsigned int const
,xxx::LayoutObject *> > > & s={...}) Line 118 + 0x1a C++
 
ddc.exe!boost::serialization::stl::rebuild_collection<boost::archive::polymorphic_iarchive,std::map<unsigned
int,xxx::LayoutObject *,std::less<unsigned
int>,std::allocator<std::pair<unsigned int const
,xxx::LayoutObject *> >
>,boost::serialization::stl::archive_input_map<boost::archive::polymorphic_iarchive,std::map<unsigned
int,xxx::LayoutObject *,std::less<unsigned
int>,std::allocator<std::pair<unsigned int const
,xxx::LayoutObject *> > >
>,boost::serialization::stl::no_reserve_imp<std::map<unsigned
int,xxx::LayoutObject *,std::less<unsigned
int>,std::allocator<std::pair<unsigned int const
,minimon::base::display::dispman::CLayoutObject *> > >
> >(boost::archive::polymorphic_iarchive & ar={...},
std::map<unsigned int,xxx::LayoutObject
*,std::less<unsigned
int>,std::allocator<std::pair<unsigned int const
,xxx::LayoutObject *> > > & s={...}) Line 209 C++
 
ddc.exe!boost::serialization::stl::load_collection<boost::archive::polymorphic_iarchive,std::map<unsigned
int,xxx::LayoutObject *,std::less<unsigned
int>,std::allocator<std::pair<unsigned int const
,xxx::LayoutObject *> >
>,boost::serialization::stl::archive_input_map<boost::archive::polymorphic_iarchive,std::map<unsigned
int,xxx::LayoutObject *,std::less<unsigned
int>,std::allocator<std::pair<unsigned int const
,xxx::LayoutObject *> > >
>,boost::serialization::stl::no_reserve_imp<std::map<unsigned
int,xxx::LayoutObject *,std::less<unsigned
int>,std::allocator<std::pair<unsigned int const
,xxx::LayoutObject *> > > >
>(boost::archive::polymorphic_iarchive & ar={...},
std::map<unsigned int,xxx::LayoutObject
*,std::less<unsigned
int>,std::allocator<std::pair<unsigned int const
,xxx::LayoutObject *> > > & s={...}) Line 230 + 0xd C++

----
The serializing code is implemented using split members
and manual registration and usually read like this:
---- snip  ---
void DerivedLayoutObject::serialize(
boost::archive::polymorphic_oarchive& ar, const
unsigned int /* version */)
{
	// register pointer type info
	ar.register_type(static_cast<LayoutObject*>(0));
	// serialize data members
	ar & boost::serialization::make_nvp( "status", m_status);
       ....
	// serialize stl  container (std::map here)
	ar & boost::serialization::make_nvp( "childs", m_childs);
}
(deserialization vise-versa)
---------------------
Whats the problem here?
I simply rebuilt the whole project using 1.33.
Regards,
A. Focht
----------------------------------------------------------------------
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=107586&aid=1262084&group_id=7586
-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
Boost-bugs mailing list
Boost-bugs_at_[hidden]
https://lists.sourceforge.net/lists/listinfo/boost-bugs

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk