Boost C++ Libraries: Ticket #9601: Unable to load archives with pointer instances which contain self reference cycles in 1.55 https://svn.boost.org/trac10/ticket/9601 <p> First the original pointer is loaded like so: </p> <div class="wiki-code"><div class="code"><pre><span class="c1">// because the following operation could move the items</span> <span class="c1">// don&#39;t use co after this</span> <span class="c1">// add to list of serialized objects so that we can properly handle</span> <span class="c1">// cyclic strucures</span> <span class="c1">//! Note: t&#39;s value is undefined at this point. It&#39;s whatever value it had when serialization was called.</span> <span class="n">object_id_vector</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">aobject</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">cid</span><span class="p">));</span> <span class="c1">// remember that that the address of these elements could change</span> <span class="c1">// when we make another call so don&#39;t use the address</span> <span class="n">bpis_ptr</span><span class="o">-&gt;</span><span class="n">load_object_ptr</span><span class="p">(</span> <span class="n">ar</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">m_pending</span><span class="p">.</span><span class="n">version</span> <span class="p">);</span> <span class="n">BOOST_ASSERT</span><span class="p">(</span><span class="nb">NULL</span> <span class="o">!=</span> <span class="n">t</span><span class="p">);</span> <span class="c1">//! Note: The object_id_vector element&#39;s address is not updated until the load is complete.</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="n">object_id_vector</span><span class="p">[</span><span class="n">ui</span><span class="p">].</span><span class="n">address</span> <span class="o">=</span> <span class="n">t</span><span class="p">;</span> </pre></div></div><p> load_object_ptr will eventually lead to: </p> <div class="wiki-code"><div class="code"><pre><span class="k">template</span><span class="o">&lt;</span><span class="k">class</span> <span class="nc">Archive</span><span class="p">,</span> <span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span> <span class="n">BOOST_DLLEXPORT</span> <span class="kt">void</span> <span class="n">pointer_iserializer</span><span class="o">&lt;</span><span class="n">Archive</span><span class="p">,</span> <span class="n">T</span><span class="o">&gt;::</span><span class="n">load_object_ptr</span><span class="p">(</span> <span class="n">basic_iarchive</span> <span class="o">&amp;</span> <span class="n">ar</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">file_version</span> <span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="p">...</span> <span class="c1">//! This serializes an instance of T </span> <span class="n">ar_impl</span> <span class="o">&gt;&gt;</span> <span class="n">boost</span><span class="o">::</span><span class="n">serialization</span><span class="o">::</span><span class="n">make_nvp</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="o">*</span> <span class="n">t</span><span class="p">);</span> <span class="p">}</span> </pre></div></div><p> If t contains a cyclic reference to itself then the following is called: </p> <div class="wiki-code"><div class="code"><pre><span class="c1">// extra line to evade borland issue</span> <span class="k">const</span> <span class="kt">bool</span> <span class="n">tracking</span> <span class="o">=</span> <span class="n">co</span><span class="p">.</span><span class="n">tracking_level</span><span class="p">;</span> <span class="c1">// if we&#39;re tracking and the pointer has already been read</span> <span class="k">if</span><span class="p">(</span><span class="n">tracking</span> <span class="o">&amp;&amp;</span> <span class="o">!</span> <span class="n">track</span><span class="p">(</span><span class="n">ar</span><span class="p">,</span> <span class="n">t</span><span class="p">))</span> <span class="c1">// we&#39;re done</span> <span class="k">return</span> <span class="n">bpis_ptr</span><span class="p">;</span> </pre></div></div><p> track will check if the oid is already loaded and assign the address of the previously loaded pointer. </p> <div class="wiki-code"><div class="code"><pre><span class="kt">bool</span> <span class="n">basic_iarchive_impl</span><span class="o">::</span><span class="n">track</span><span class="p">(</span> <span class="n">basic_iarchive</span> <span class="o">&amp;</span> <span class="n">ar</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span> <span class="o">&amp;</span> <span class="n">t</span> <span class="p">){</span> <span class="p">...</span> <span class="c1">// if its a reference to a old object</span> <span class="k">if</span><span class="p">(</span><span class="n">object_id_type</span><span class="p">(</span><span class="n">object_id_vector</span><span class="p">.</span><span class="n">size</span><span class="p">())</span> <span class="o">&gt;</span> <span class="n">oid</span><span class="p">){</span> <span class="c1">// we&#39;re done</span> <span class="c1">//! Note this line: ***</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="n">t</span> <span class="o">=</span> <span class="n">object_id_vector</span><span class="p">[</span><span class="n">oid</span><span class="p">].</span><span class="n">address</span><span class="p">;</span> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="nb">true</span><span class="p">;</span> <span class="p">}</span> </pre></div></div><p> Recall back at the original scope <a class="changeset" href="https://svn.boost.org/trac10/changeset/1" title="Import core sources for SVNmanger 0.38 ">[1]</a>: remember that that the address of these elements could change </p> <div class="wiki-code"><div class="code"><pre><span class="c1">// when we make another call so don&#39;t use the address</span> <span class="n">bpis_ptr</span><span class="o">-&gt;</span><span class="n">load_object_ptr</span><span class="p">(</span> <span class="n">ar</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">m_pending</span><span class="p">.</span><span class="n">version</span> <span class="p">);</span> <span class="n">BOOST_ASSERT</span><span class="p">(</span><span class="nb">NULL</span> <span class="o">!=</span> <span class="n">t</span><span class="p">);</span> <span class="c1">//! The assignment to object_id_vector[ui].address takes place after the cycle is loaded.</span> <span class="c1">//! This means means the value assigned to t at [2] is undefined.</span> <span class="n">object_id_vector</span><span class="p">[</span><span class="n">ui</span><span class="p">].</span><span class="n">address</span> <span class="o">=</span> <span class="n">t</span><span class="p">;</span> </pre></div></div><p> Here's a unit test that illustrates the issue: </p> <div class="wiki-code"><div class="code"><pre><span class="k">namespace</span> <span class="n">TestPointerSerializationReferenceCycle</span> <span class="p">{</span> <span class="k">struct</span> <span class="n">PointerHolder</span> <span class="p">{</span> <span class="n">PointerHolder</span><span class="p">(</span><span class="n">PointerHolder</span><span class="o">*</span> <span class="n">ptr</span> <span class="o">=</span> <span class="k">nullptr</span><span class="p">)</span> <span class="o">:</span> <span class="n">Ptr</span><span class="p">(</span><span class="n">ptr</span><span class="p">)</span> <span class="p">{}</span> <span class="n">PointerHolder</span><span class="o">*</span> <span class="n">Ptr</span><span class="p">;</span> <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">Archive</span><span class="o">&gt;</span> <span class="kt">void</span> <span class="n">serialize</span><span class="p">(</span><span class="n">Archive</span><span class="o">&amp;</span> <span class="n">ar</span><span class="p">,</span> <span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v</span><span class="p">)</span> <span class="p">{</span> <span class="n">ar</span> <span class="o">&amp;</span> <span class="n">Ptr</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span> <span class="p">}</span> <span class="n">BOOST_AUTO_TEST_CASE</span><span class="p">(</span><span class="n">TestPointerReferenceCycleLoad</span><span class="p">)</span> <span class="p">{</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">TestPointerSerializationReferenceCycle</span><span class="p">;</span> <span class="n">std</span><span class="o">::</span><span class="n">stringstream</span> <span class="n">buff</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">stringstream</span><span class="o">::</span><span class="n">in</span> <span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">stringstream</span><span class="o">::</span><span class="n">out</span><span class="p">);</span> <span class="c1">//! Write it.</span> <span class="p">{</span> <span class="n">PointerHolder</span><span class="o">*</span> <span class="n">pPtrHldr</span> <span class="o">=</span> <span class="k">new</span> <span class="n">PointerHolder</span><span class="p">();</span> <span class="n">pPtrHldr</span><span class="o">-&gt;</span><span class="n">Ptr</span> <span class="o">=</span> <span class="n">pPtrHldr</span><span class="p">;</span> <span class="n">boost</span><span class="o">::</span><span class="n">archive</span><span class="o">::</span><span class="n">text_oarchive</span> <span class="n">ar</span><span class="p">(</span><span class="n">buff</span><span class="p">);</span> <span class="n">ar</span> <span class="o">&amp;</span> <span class="n">pPtrHldr</span><span class="p">;</span> <span class="p">}</span> <span class="c1">//! Read it.</span> <span class="p">{</span> <span class="n">buff</span><span class="p">.</span><span class="n">seekg</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> <span class="n">PointerHolder</span><span class="o">*</span> <span class="n">pPtrHldr</span> <span class="o">=</span> <span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="n">PointerHolder</span><span class="o">*&gt;</span><span class="p">(</span><span class="mh">0xBAADF00D</span><span class="p">);</span> <span class="n">boost</span><span class="o">::</span><span class="n">archive</span><span class="o">::</span><span class="n">text_iarchive</span> <span class="n">ar</span><span class="p">(</span><span class="n">buff</span><span class="p">);</span> <span class="n">ar</span> <span class="o">&amp;</span> <span class="n">pPtrHldr</span><span class="p">;</span> <span class="n">BOOST_CHECK</span><span class="p">(</span><span class="n">pPtrHldr</span> <span class="o">!=</span> <span class="k">nullptr</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">pPtrHldr</span> <span class="o">!=</span> <span class="k">nullptr</span><span class="p">)</span> <span class="p">{</span> <span class="n">BOOST_CHECK</span><span class="p">(</span><span class="n">pPtrHldr</span><span class="o">-&gt;</span><span class="n">Ptr</span> <span class="o">==</span> <span class="n">pPtrHldr</span><span class="p">);</span><span class="c1">//! At this point pPtrHldr-&gt;Ptr == 0xBAADFOOD.</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> </pre></div></div> en-us Boost C++ Libraries /htdocs/site/boost.png https://svn.boost.org/trac10/ticket/9601 Trac 1.4.3 Robert Ramey Wed, 22 Jan 2014 18:29:56 GMT status changed https://svn.boost.org/trac10/ticket/9601#comment:1 https://svn.boost.org/trac10/ticket/9601#comment:1 <ul> <li><strong>status</strong> <span class="trac-field-old">new</span> → <span class="trac-field-new">assigned</span> </li> </ul> <p> boy - I bet this cost a lot of effort to figure out. </p> <p> Note that the test set includes a specific test for cyclic pointers which is passing. </p> <p> I'm thinking that the difference between that test and your test isn't so much a cycle as a self referential object. I remember when I wrote code to address cyclical pointers many other serialization system failed on cyclical chains so I took special care to make this work. This should be apparent from all the comments. </p> <p> I'm also thinking that the correct fix is to tweak the code so that it addresses the special case of a self referential object such as yours. </p> <p> Of course I wrote this many years ago and this is extremely intricate code. It takes me at least a day to wrap my head around this case, make a small test case and integrate it into the test suite. Since you've already done the head wrapping part, maybe you want to make a stab at tweaking the code to address this corner case. </p> <p> This is predicated on my guess that this is really just a corner case I failed to consider and not some fundamental issue which requires a major overhaul. If I'm wrong about this, feel free to let me know. </p> <p> Robert Ramey </p> Ticket Brandon Kohn Wed, 22 Jan 2014 20:12:14 GMT <link>https://svn.boost.org/trac10/ticket/9601#comment:2 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9601#comment:2</guid> <description> <p> Replying to <a class="ticket" href="https://svn.boost.org/trac10/ticket/9601#comment:1" title="Comment 1">ramey</a>: </p> <blockquote class="citation"> <p> boy - I bet this cost a lot of effort to figure out. </p> </blockquote> <p> Yeah, it's fun stuff :). Anyone who doesn't appreciate the intricacies of implementing a serialization library needs to spend time debugging one. </p> <blockquote class="citation"> <p> Note that the test set includes a specific test for cyclic pointers which is passing. </p> <p> I'm thinking that the difference between that test and your test isn't so much a cycle as a self referential object. </p> </blockquote> <p> If you mean serialization\test\test_cyclic_ptrs.cpp, I'll give it a more thorough look. </p> <p> We've been using boost serialization at my work for our application files and have just recently moved from 1.53 to 1.55 to support vc12. The use case where I found this was more complex than the unit-test as it involved polymorphic types held in shared_ptr instances with the cyclic reference being held inside a std::map member variable. The unit-test was just the most simple cycle I could think of which illustrated the issue. </p> <blockquote class="citation"> <p> I'm also thinking that the correct fix is to tweak the code so that it addresses the special case of a self referential object such as yours. *snip* This is predicated on my guess that this is really just a corner case I failed to consider and not some fundamental issue which requires a major overhaul. If I'm wrong about this, feel free to let me know. </p> </blockquote> <p> My suspicion is that it would affect any cycle, but I've been wrong before ;). I'm already having a think about how I would fix it. </p> <p> One note is that it worked in 1.53. It seems to have stopped working when a change was made to : </p> <div class="wiki-code"><div class="code"><pre><span class="c1">// remember that that the address of these elements could change</span> <span class="c1">// when we make another call so don&#39;t use the address</span> <span class="n">bpis_ptr</span><span class="o">-&gt;</span><span class="n">load_object_ptr</span><span class="p">(</span> <span class="n">ar</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span><span class="c1">//! used to be object_id_vector[ui].address</span> <span class="n">m_pending</span><span class="p">.</span><span class="n">version</span> <span class="p">);</span> </pre></div></div><p> And then in iserializer.hpp (the old version before SHA: 8af0e20bb091631a153147587d7958492be623ae): </p> <div class="wiki-code"><div class="code"><pre><span class="n">BOOST_DLLEXPORT</span> <span class="kt">void</span> <span class="n">pointer_iserializer</span><span class="o">&lt;</span><span class="n">Archive</span><span class="p">,</span> <span class="n">T</span><span class="o">&gt;::</span><span class="n">load_object_ptr</span><span class="p">(</span> <span class="n">basic_iarchive</span> <span class="o">&amp;</span> <span class="n">ar</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span> <span class="o">&amp;</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">file_version</span> <span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="n">Archive</span> <span class="o">&amp;</span> <span class="n">ar_impl</span> <span class="o">=</span> <span class="n">boost</span><span class="o">::</span><span class="n">serialization</span><span class="o">::</span><span class="n">smart_cast_reference</span><span class="o">&lt;</span><span class="n">Archive</span> <span class="o">&amp;&gt;</span><span class="p">(</span><span class="n">ar</span><span class="p">);</span> <span class="n">auto_ptr_with_deleter</span><span class="o">&lt;</span> <span class="n">T</span> <span class="o">&gt;</span> <span class="n">ap</span><span class="p">(</span><span class="n">heap_allocator</span><span class="o">&lt;</span> <span class="n">T</span> <span class="o">&gt;::</span><span class="n">invoke</span><span class="p">());</span> <span class="k">if</span><span class="p">(</span><span class="nb">NULL</span> <span class="o">==</span> <span class="n">ap</span><span class="p">.</span><span class="n">get</span><span class="p">())</span> <span class="n">boost</span><span class="o">::</span><span class="n">serialization</span><span class="o">::</span><span class="n">throw_exception</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">bad_alloc</span><span class="p">())</span> <span class="p">;</span> <span class="n">T</span> <span class="o">*</span> <span class="n">t</span> <span class="o">=</span> <span class="n">ap</span><span class="p">.</span><span class="n">get</span><span class="p">();</span> <span class="n">x</span> <span class="o">=</span> <span class="n">t</span><span class="p">;</span><span class="c1">//! This would update the object_id_vector[ui].address member with the right ptr.</span> </pre></div></div><p> The new code doesn't do this assignment before deserializing. So my first idea for a fix would be to create a version of load_object_ptr with an overload to update the address member of that vector as before. </p> <p> There is a comment: </p> <div class="wiki-code"><div class="code"><pre><span class="c1">// remember that that the address of these elements could change</span> <span class="c1">// when we make another call so don&#39;t use the address</span> </pre></div></div><p> It makes me wonder if there's something funky that can happen to that address which I might be missing. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Robert Ramey</dc:creator> <pubDate>Wed, 22 Jan 2014 20:25:06 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/9601#comment:3 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9601#comment:3</guid> <description> <p> "One note is that it worked in 1.53. It seems to have stopped working when a change was made to : ..." </p> <p> That's it almost for sure. I made this change about a year ago when some guy writing a book claimed that the library was slow. Damn if his case wasn't slow - After wracking my brain, I did "fix" this and everything passed so I declared victory. The slowness was due to checking the whole list of tracked pointers rather than the most recent ones. (IIRC). or something like that </p> <p> <em> remember that that the address of these elements could change </em> when we make another call so don't use the address </p> <p> This comment reminds us that caching some address, calling lower level serialization, might change the address of the object originally pointed to. So don't cache the address - or if you do, note that it expires when one calls to a lower level. </p> <p> Thanks for looking into this. I know it's a bitch. </p> <p> Robert Ramey </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Brandon Kohn</dc:creator> <pubDate>Wed, 22 Jan 2014 20:47:36 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/9601#comment:4 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9601#comment:4</guid> <description> <p> Yep, I put together a build with a few changes to test and it works. Let me put together a clean patch as a proposal. My current working copy contains an unadopted patch to workaround a previous issue, so I need to get a clean checkout and make the changes on top of that for the patch. </p> <p> Cheers, </p> <p> Brandon Kohn </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Brandon Kohn</dc:creator> <pubDate>Wed, 22 Jan 2014 23:50:17 GMT</pubDate> <title>attachment set https://svn.boost.org/trac10/ticket/9601 https://svn.boost.org/trac10/ticket/9601 <ul> <li><strong>attachment</strong> → <span class="trac-field-new">0001-Added-new-method-for-loading-tracked-pointers-which-.patch</span> </li> </ul> <p> Proposed patch to resolve issue </p> Ticket Brandon Kohn Wed, 22 Jan 2014 23:50:35 GMT attachment set https://svn.boost.org/trac10/ticket/9601 https://svn.boost.org/trac10/ticket/9601 <ul> <li><strong>attachment</strong> → <span class="trac-field-new">0001-Added-unit-test-for-regression-testing-of-trac9601-i.patch</span> </li> </ul> <p> Proposed unit test for the issue </p> Ticket Brandon Kohn Wed, 22 Jan 2014 23:53:44 GMT <link>https://svn.boost.org/trac10/ticket/9601#comment:5 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9601#comment:5</guid> <description> <p> I've put up two patches: one with a proposed fix and another with changes to test which cover the unit-test I did above. Let me know if there's anything you would like done differently and thanks for letting me lend a hand. </p> <p> I suppose it might be prudent for me to flesh out the unit-test a bit more with more complex cases involving base types. </p> <p> Cheers, </p> <p> Brandon </p> <p> P.S. Also let me know if something is funky from the patches, I'm not a diff guru ;). </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Brandon Kohn</dc:creator> <pubDate>Thu, 23 Jan 2014 19:02:55 GMT</pubDate> <title>attachment set https://svn.boost.org/trac10/ticket/9601 https://svn.boost.org/trac10/ticket/9601 <ul> <li><strong>attachment</strong> → <span class="trac-field-new">0001-Cleaned-up-some-tab-space-for-consistency.patch</span> </li> </ul> <p> Added new cycle unit-test with multiple base types. </p> Ticket anonymous Fri, 24 Jan 2014 14:52:08 GMT <link>https://svn.boost.org/trac10/ticket/9601#comment:6 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9601#comment:6</guid> <description> <p> With these patches I've managed to run these tests successfully on vc8 (with some changes for friendship to interface_archive), vc11, vc12 and gcc 4.5.3. </p> <p> There is still a lingering question as to whether the patch is a sufficient fix. That comment that the cached value can change suggests a use-case which might still break. Do you have an idea of what the conditions for that case might be? </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Robert Ramey</dc:creator> <pubDate>Thu, 30 Jan 2014 00:22:03 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/9601#comment:7 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9601#comment:7</guid> <description> <p> I've spent a fair amount of time investigating this. </p> <p> I think that this is a problem which as always existed in the library. Note that the following fails </p> <pre class="wiki"> PointerHolder *pph = new PointerHolder; pph-&gt;m_ph = pph; test_ostream os(testfile, TEST_STREAM_FLAGS); test_oarchive oa(os, TEST_ARCHIVE_FLAGS); //oa &lt;&lt; BOOST_SERIALIZATION_NVP(pph); oa &lt;&lt; pph; </pre><p> While this passes: </p> <pre class="wiki"> PointerHolder ph; pph.m_ph = ph; test_ostream os(testfile, TEST_STREAM_FLAGS); test_oarchive oa(os, TEST_ARCHIVE_FLAGS); //oa &lt;&lt; BOOST_SERIALIZATION_NVP(pph); oa &lt;&lt; pph; </pre><p> That is, this issue is the usage of a recursive data structure at the "top" level. </p> <p> Actually I believe that this could occur whenever ALL the pointers are allocated with "new" so I think your fix is too specific. On the other hand, looking at the internals, it's not obvious how to fix this. It's sort of a chicken and egg issue. That is it's hard to assign the address of an object which we are still creating. </p> </description> <category>Ticket</category> </item> <item> <author>blkohn@…</author> <pubDate>Thu, 30 Jan 2014 01:57:43 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/9601#comment:8 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9601#comment:8</guid> <description> <p> Edit: after learning about BOOST_CLASS_TRACKING, the earlier comment made no sense. ;) </p> </description> <category>Ticket</category> </item> <item> <author>Chris Rusby <chris.rusby@…></author> <pubDate>Thu, 30 Jan 2014 13:13:51 GMT</pubDate> <title/> <link>https://svn.boost.org/trac10/ticket/9601#comment:9 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9601#comment:9</guid> <description> <p> Hi all, </p> <p> This looks very similar to the issue I raised a couple of days ago (<a class="closed ticket" href="https://svn.boost.org/trac10/ticket/9612" title="#9612: Bugs: Memory Access Violation when recursively serializing classes (closed: invalid)">#9612</a>), although I've patched my version and it still fails. </p> <p> I'll take a more detailed look over the weekend, but in the interim if you have any thoughts as to what causes my issue I'd be interested to hear them! </p> <p> Thanks, </p> <p> Chris </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Robert Ramey</dc:creator> <pubDate>Thu, 30 Jan 2014 19:31:22 GMT</pubDate> <title>status changed; resolution set https://svn.boost.org/trac10/ticket/9601#comment:10 https://svn.boost.org/trac10/ticket/9601#comment:10 <ul> <li><strong>status</strong> <span class="trac-field-old">assigned</span> → <span class="trac-field-new">closed</span> </li> <li><strong>resolution</strong> → <span class="trac-field-new">fixed</span> </li> </ul> <p> OK </p> <p> I believe that I've fixed the problem. I'm still doing final testing but I expect to push the changes to the development branch before close of business today. </p> <p> Robert Ramey </p> Ticket Brandon Kohn Fri, 31 Jan 2014 14:26:22 GMT <link>https://svn.boost.org/trac10/ticket/9601#comment:11 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/9601#comment:11</guid> <description> <p> Thanks Robert, </p> <p> I look forward to grabbing the changes. </p> <p> Cheers, </p> <p> Brandon </p> </description> <category>Ticket</category> </item> </channel> </rss>