Boost serialization check fails for boost 1.68.0

37 views
Skip to first unread message

Maxi Miller

unread,
Oct 10, 2018, 4:03:01 AM10/10/18
to deal.II User Group
When trying to configure deal.II with the system version of Boost (1.68.0) I get the error "Performing Test BOOST_SERIALIZATION_USABLE - Failed". Thus I tried running the test separately, which resulted in a memory access error (double free). I used the following code from the test folder:

/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// test_dll_exported.cpp

// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

// should pass compilation and execution

// This is an overly complex test.  The purpose of this test is to
// demonstrate and test the ability to serialize a hierarchy of class
// through a base class pointer even though that class might be
// implemented in different dlls and use different extended type info
// systems.
//
// polymorphic_ base is locally declared and defined.  It use the
// "no_rtti" extended type info system.

// polymorphic_derived1 is locally declared and defined.  It uses
// the default "type_id" extended type info system

// polymorphic_derived2 is declared in polymorphic_derived.hpp
// and defined in dll_polymorphic_derived2.  It uses the typeid
// system.

#include <cstddef> // NULL
#include <fstream>
#include <iostream>

#include <boost/config.hpp>

#include <boost/archive/archive_exception.hpp>

#include <boost/serialization/base_object.hpp>
#include <boost/serialization/export.hpp>

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

#include "polymorphic_base.hpp"

#include "polymorphic_derived2.hpp"

// save exported polymorphic class
void save_exported(const char *testfile)
{
    std
::ofstream os(testfile);
    boost
::archive::text_oarchive oa(os);

    polymorphic_base
*rb2 = new polymorphic_derived2;
    polymorphic_derived2
*rd21 = new polymorphic_derived2;

   
// export will permit correct serialization
   
// through a pointer to a base class
    oa
<< BOOST_SERIALIZATION_NVP(rb2);
    oa
<< BOOST_SERIALIZATION_NVP(rd21);

   
delete rb2;
   
delete rd21;
}

// save exported polymorphic class
void load_exported(const char *testfile)
{
    std
::ifstream is(testfile);
    boost
::archive::text_iarchive ia(is);

    polymorphic_base
*rb2 = NULL;
    polymorphic_derived2
*rd21 = NULL;

   
// export will permit correct serialization
   
// through a pointer to a base class
    ia
>> BOOST_SERIALIZATION_NVP(rb2);
   
assert(
        boost
::serialization::type_info_implementation<polymorphic_derived2>
           
::type::get_const_instance()
       
==
       
* boost::serialization::type_info_implementation<polymorphic_base>
           
::type::get_const_instance().get_derived_extended_type_info(*rb2));
    ia
>> BOOST_SERIALIZATION_NVP(rd21);
   
assert(
        boost
::serialization::type_info_implementation<polymorphic_derived2>
           
::type::get_const_instance()
       
==
       
* boost::serialization::type_info_implementation<polymorphic_derived2>
           
::type::get_const_instance().get_derived_extended_type_info(*rd21));
   
delete rb2;
   
delete rd21;
}

int main( int /* argc */, char* /* argv */[] )
{
    std
::cout << "Exporting test file\n";
    save_exported
("testfile");
    std
::cout << "Test file exported, importing test file\n";
    load_exported
("testfile");
    std
::cout << "Test file imported, finished\n";
   
return EXIT_SUCCESS;
}

// EOF


Nevertheless it works when changing it to
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// test_dll_exported.cpp

// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

// should pass compilation and execution

// This is an overly complex test.  The purpose of this test is to
// demonstrate and test the ability to serialize a hierarchy of class
// through a base class pointer even though that class might be
// implemented in different dlls and use different extended type info
// systems.
//
// polymorphic_ base is locally declared and defined.  It use the
// "no_rtti" extended type info system.

// polymorphic_derived1 is locally declared and defined.  It uses
// the default "type_id" extended type info system

// polymorphic_derived2 is declared in polymorphic_derived.hpp
// and defined in dll_polymorphic_derived2.  It uses the typeid
// system.

#include <cstddef> // NULL
#include <fstream>
#include <iostream>

#include <boost/config.hpp>

#include <boost/archive/archive_exception.hpp>

#include <boost/serialization/base_object.hpp>
#include <boost/serialization/export.hpp>

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

#include "polymorphic_base.hpp"

#include "polymorphic_derived2.hpp"

// save exported polymorphic class
void save_exported(const char *testfile)
{
    std
::ofstream os(testfile);
    boost
::archive::text_oarchive oa(os);

    polymorphic_base
*rb2 = new polymorphic_derived2;
    polymorphic_derived2
*rd21 = new polymorphic_derived2;

   
// export will permit correct serialization
   
// through a pointer to a base class
//    oa << BOOST_SERIALIZATION_NVP(rb2);
    oa
<< BOOST_SERIALIZATION_NVP(rd21);

   
delete rb2;
   
delete rd21;
}

// save exported polymorphic class
void load_exported(const char *testfile)
{
    std
::ifstream is(testfile);
    boost
::archive::text_iarchive ia(is);

    polymorphic_base
*rb2 = NULL;
    polymorphic_derived2
*rd21 = NULL;

   
// export will permit correct serialization
   
// through a pointer to a base class
/*    ia >> BOOST_SERIALIZATION_NVP(rb2);
    assert(
        boost::serialization::type_info_implementation<polymorphic_derived2>
            ::type::get_const_instance()
        ==
        * boost::serialization::type_info_implementation<polymorphic_base>
            ::type::get_const_instance().get_derived_extended_type_info(*rb2));*/

    ia
>> BOOST_SERIALIZATION_NVP(rd21);
   
assert(
        boost
::serialization::type_info_implementation<polymorphic_derived2>
           
::type::get_const_instance()
       
==
       
* boost::serialization::type_info_implementation<polymorphic_derived2>
           
::type::get_const_instance().get_derived_extended_type_info(*rd21));
   
delete rb2;
   
delete rd21;
}

int main( int /* argc */, char* /* argv */[] )
{
    std
::cout << "Exporting test file\n";
    save_exported
("testfile");
    std
::cout << "Test file exported, importing test file\n";
    load_exported
("testfile");
    std
::cout << "Test file imported, finished\n";
   
return EXIT_SUCCESS;
}

// EOF


Is that a general problem, or a problem just for my system? Or is that a boost-related error, and thus not related to deal.II?

Bruno Turcksin

unread,
Oct 10, 2018, 8:18:12 AM10/10/18
to deal.II User Group
Hi,


On Wednesday, October 10, 2018 at 4:03:01 AM UTC-4, Maxi Miller wrote:

Is that a general problem, or a problem just for my system? Or is that a boost-related error, and thus not related to deal.II?
It's a problem with boost 1.68.0. See https://github.com/boostorg/serialization/pull/105#issuecomment-428262683here how to patch boost 1.68.0 to fix the problem.

Best,

Bruno

Maxi Miller

unread,
Oct 10, 2018, 9:34:12 AM10/10/18
to deal.II User Group
Hmm, difficult to apply here, I installed boost via the package manager, thus I am not sure how I can apply the patch there...

Wolfgang Bangerth

unread,
Oct 10, 2018, 11:32:15 AM10/10/18
to dea...@googlegroups.com
On 10/10/2018 07:34 AM, 'Maxi Miller' via deal.II User Group wrote:
> Hmm, difficult to apply here, I installed boost via the package manager,
> thus I am not sure how I can apply the patch there...

You don't have to. If the deal.II cmake mechanism detects that the boost
you have on your system (1.68) is not usable, it just falls back to the
one in the bundled/ directory of deal.II. Nothing bad happens just
because that check fails.

Best
W.

--
------------------------------------------------------------------------
Wolfgang Bangerth email: bang...@colostate.edu
www: http://www.math.colostate.edu/~bangerth/

Maxi Miller

unread,
Oct 11, 2018, 7:04:00 AM10/11/18
to deal.II User Group
I already compiled other libraries (such as ADOL-C) based on the boost libraries in the system, thus I would have preferred if I could use this boost-version.
Reply all
Reply to author
Forward
0 new messages