Boost logo

Boost Users :

Subject: Re: [Boost-users] crash in boost serialization (1.44)
From: Guy Prémont (guy.premont_at_[hidden])
Date: 2010-12-09 17:25:51


I had the same problem, i could pin point to the fact that when
serialization is in a DLL, the i/oserializer and pointer_i/oserializer are
created for each DLL that uses serialization of a class (and in the main exe
if there is code there that uses serialization for this class). The
singleton are always dll exported, never imported.

To make a long story short, in the serialization libs, the method
basic_iarchive_impl::register_type(const basic_iserializer & bis) is called
several times and may overwrite the bpis_ptr that was set earlier.

To fix this, I had to rebuild boost.serialization by and modify
basic_iarchive.cpp.
I changed the line:
        coid.bpis_ptr = bis.get_bpis_ptr();
to
     if (coid.bpis_ptr == 0) coid.bpis_ptr = bis.get_bpis_ptr();

But, there are a few issues with serialization methods when they are
implemented inside a dll and called from outside.

Guy

--
Guy Prémont, D.Sc.
Architecte logiciel senior / Senior software architect
CM Labs Simulations Inc. http://www.cm-labs.com/
Tel. 514-287-1166 ext. 237 
> -----Original Message-----
> From: boost-users-bounces_at_[hidden] [mailto:boost-users-
> bounces_at_[hidden]] On Behalf Of rico.cadetg_at_[hidden]
> Sent: Wednesday, December 08, 2010 11:20 AM
> To: boost-users_at_[hidden]
> Subject: [Boost-users] crash in boost serialization (1.44)
> 
> Hello,
> 
> I’ve noticed a crash (accessing a null pointer) inside the boost
> serialization (version 1.44). I use visual studio 2005, the code to
> serialize is in a Dll. I have a small visual studio solution that
> reproduces the crash, I guess it is a bug and should cause a crash in
> other environments as well.
> 
> I have the following classes
> 
> INode (Interface)
> Node (Abstract, derived from INode)
> LeafNode(derived from Node)
> TableNode(derived from Node)
> 
> The TableNode has a list of INode*, the children. A TableNode itself
> can be a child of a TableNode.
> 
> All classes are inside a Dll and correctly exported (I have no
> “unregistered class” exceptions).
> 
> If I create a TableNode with some entries including another TableNode
> and serialize it as an object, I get the crash when trying to
> deserialize later. If I do the same, but serialize the parent TableNode
> as a pointer, it works.
> 
> I guess the serialization framework does not recognize that a TableNode
> gets serialized through a pointer and therefore the object tracking
> does not work correctly.
> 
> I can send the example solution if needed.
> 
> The crash is in the basic_iarchive.cpp, line 456 (bpis_ptr is null):
> if(! tracking){
>     bpis_ptr->load_object_ptr(ar, t, co.file_version);
> }
> 
> Best regards,
> Rico
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users

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