Opened 4 years ago
#13563 new Patches
Error deserializing empty forward_list
Reported by: | Owned by: | Robert Ramey | |
---|---|---|---|
Milestone: | To Be Determined | Component: | serialization |
Version: | Boost 1.67.0 | Severity: | Showstopper |
Keywords: | Cc: |
Description
Deserializing an empty forward_list is broken if the elements aren't default constructible (with old compilers it's enough that elements have a non-trivial default constructor).
A patch is attached. The problem is that the first element is always loaded first, even if the list is empty. The result may be a crash or any undefined behavior, since deserialization goes out of sync.
Test case:
#include <boost/serialization/forward_list.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/archive/binary_oarchive.hpp> #include <forward_list> #include <iostream> #include <sstream> struct Foo { int x; Foo(int a) : x(a) {}; template<class Archive> void serialize(Archive& ar, const unsigned int) { ar & x; } private: friend class boost::serialization::access; Foo() = default; }; int main() { std::forward_list<Foo> flist; std::ostringstream oss; boost::archive::binary_oarchive oa{oss}; oa << flist; std::istringstream iss{oss.str()}; boost::archive::binary_iarchive ia{iss}; ia >> flist; }
Results in:
terminate called after throwing an instance of 'boost::archive::archive_exception' what(): input stream error Aborted (core dumped)
Attachments (1)
Note:
See TracTickets
for help on using tickets.