
Avi Bahra wrote:
I have a serious regression in boost 1.42 serialisation. Now getting a unregistered class, exception, on Suse linux using gcc 4.2.1. This test passes on boost 1.39/1.40.
There are 3 files involved to recreate the crash: included below: Main.cpp BaseHolder.hpp BaseHolder.cpp
The file BaseHolder.hpp/cpp defines 3 classes Base Derived BaseHolder
Here is what I found: 1/ If all the functionality is put in one file. i.e Main.cpp then _no_ crash 2/ If all 3 files are compiled together then _no_ crash 3/ However if BaseHolder is added to static library and linked with Main.cpp then we get the _crash_ ( only in 1.42 )
Also getting a spurious warning message: Again this warning only appears in 1.42
/var/tmp/ma0/boost/boost_1_42_0/boost/mpl/print.hpp: In instantiation of ?boost::mpl::print
?: /var/tmp/ma0/boost/boost_1_42_0/boost/serialization/static_warning.hpp:92: instantiated from ?boost::serialization::static_warning_test
? /var/tmp/ma0/boost/boost_1_42_0/boost/archive/detail/check.hpp:98:
****** The code comment at check.hpp : 98 says: // may be an indicator of an error usage of the // serialization library and should be double checked. // See documentation on object tracking. Also, see the // "rationale" section of the documenation // for motivation for this checking. ....
/var/tmp/ma0/clientRoot/workspace/MyProject/SCRATCH/src/Main.cpp:16: instantiated from here /var/tmp/ma0/boost/boost_1_42_0/boost/mpl/print.hpp:55: warning: comparison between signed and unsigned integer expressions gcc.archive bin/gcc-4.2.1/debug/link-static/libnodeattr.a gcc.link bin/gcc-4.2.1/debug/test
change
int main() { std::string fileName = "test.txt"; { // If this scope is commented out, crash goes away ??? Derived saved("varname"); { std::ofstream ofs( fileName.c_str() ); boost::archive::text_oarchive oa( ofs ); oa << saved; }
To
int main() { std::string fileName = "test.txt"; { // If this scope is commented out, crash goes away ??? const Derived saved("varname"); { std::ofstream ofs( fileName.c_str() ); boost::archive::text_oarchive oa( ofs ); oa << saved; }
EXPORT has been made a little bit more elabort to separate issues of code instantiation for class registration. These changes were necessary to make EXPORT work properly with DLLS. Look at the 1.42 documentation for an explanation. Robert Ramey