Opened 15 years ago

Closed 15 years ago

#1036 closed Bugs (fixed)

assert failure in oserializer.hpp:418

Reported by: tg38@… Owned by: Robert Ramey
Milestone: To Be Determined Component: Building Boost
Version: Boost 1.34.0 Severity: Showstopper
Keywords: Cc:

Description

a.out: /usr/include/boost/archive/detail/oserializer.hpp:418: static void boost::archive::detail::save_pointer_type<Archive, TPtr>::polymorphic<T>::save(Archive&, const T&, const boost::archive::detail::basic_pointer_oserializer*) [with T = I, Archive = boost::archive::binary_oarchive, TPtr = I*]: Assertion `null != bpos_ptr' failed.

from oserializer.hpp:

sice true_type is valid, and this only gets made if the pointer oserializer object has been created, this should never fail bpos_ptr = archive_pointer_oserializer<Archive>::find(* true_type); assert(NULL != bpos_ptr);

using ubuntu 7.04 64 bits (gcc 4.1.1) and boost 1.33.1 attached file is source code to raise it.

Attachments (1)

bugasert418.cpp (2.0 KB ) - added by anonymous 15 years ago.

Download all attachments as: .zip

Change History (4)

by anonymous, 15 years ago

Attachment: bugasert418.cpp added

comment:1 by Dave Abrahams, 15 years ago

Owner: set to Robert Ramey

comment:2 by Robert Ramey, 15 years ago

Status: newassigned

I've reproduced this with that latest version. I'm investigating this.

Robert Ramey

comment:3 by Robert Ramey, 15 years ago

Resolution: fixed
Status: assignedclosed

I have studied this interesting case and made changes such that the assertion is no longer invoked.

However, there is another problem with this example which prevents it from working. The saving of T resolves to:

T -> A -> E -> C, I -> *J (abstract base) -> B

But no instance of B as been yet serialized so it is not registered with the archive. This can be remedied by inverting a number of ways:

a) the sequence A, B in serializaiton can be inverted
b) using ar.register(...) to explicitly register B
c) exporting B

Note: See TracTickets for help on using tickets.