C++ 使用boost序列化时解决消毒器错误

C++ 使用boost序列化时解决消毒器错误,c++,serialization,boost,address-sanitizer,ubsan,C++,Serialization,Boost,Address Sanitizer,Ubsan,我最近尝试使用boost序列化来序列化一个包含std::vector>作为成员的类。根据boost文档(),我们必须使用归档文件的方法register\u type注册派生类,以使序列化正常工作。所有内容确实都构建并运行良好,但地址消毒器构建(在我们的CI中运行)失败,出现以下错误: ASAN:DEADLYSIGNAL ================================================================= ==3==ERROR: AddressSani

我最近尝试使用boost序列化来序列化一个包含
std::vector>
作为成员的类。根据boost文档(),我们必须使用归档文件的方法
register\u type
注册派生类,以使序列化正常工作。所有内容确实都构建并运行良好,但地址消毒器构建(在我们的CI中运行)失败,出现以下错误:

ASAN:DEADLYSIGNAL
=================================================================
==3==ERROR: AddressSanitizer: SEGV on unknown address 0x000000100000 (pc 0x559bc5f18288 bp 0x7ffe74fd8d30 sp 0x7ffe74fd8d10 T0)
==3==The signal is caused by a READ memory access.
==3==Hint: address points to the zero page.
    #0 0x559bc5f18287 in boost::serialization::void_cast_detail::void_caster_primitive<Derived, Base>::void_caster_primitive() /usr/include/boost/serialization/void_cast.hpp:188
    #1 0x559bc5f1714a in boost::serialization::singleton<boost::serialization::void_cast_detail::void_caster_primitive<Derived, Base> >::get_instance()::singleton_wrapper::singleton_wrapper() /usr/include/boost/serialization/singleton.hpp:117
    #2 0x559bc5f173be in boost::serialization::singleton<boost::serialization::void_cast_detail::void_caster_primitive<Derived, Base> >::get_instance() /usr/include/boost/serialization/singleton.hpp:118
    #3 0x559bc5ef3294 in __static_initialization_and_destruction_0 /usr/include/boost/serialization/singleton.hpp:155
    ...
根据代码和注释判断,此表达式正在计算
派生的
类的位移。然而,它看起来仍然很神奇,特别是在将一个(看似)随机数投射到
指针时。如果有人能解释一下为什么这会计算位移,那就太好了

编辑: 下面是一个使用上述位移计算方法的简单示例:如果关闭了sanitizer,它将编译并运行,但打开后,程序会异常终止


这也是试图在编译器资源管理器上重现SEGV的原始问题:但是,链接boost序列化似乎不起作用,而且如果我打开“消毒器”选项,构建有时会超时。

问题实际上不是由Asan引起的,而是由在强制转换期间执行类类型验证(通过读取和分析对象的vptr)的UBsan引起的。在你的情况下,试图读取假地址的内存会导致崩溃

这是编译器中的一个错误,因此我强烈建议向消毒剂开发人员报告:

  • (如果问题以叮当声再现)打开

此代码不访问内存(除非某处存在虚拟继承?),因此不应导致SEGV。请摆姿势。@yugr我已经在编译器资源管理器上发布了指向MVCE的链接。请看一看。谢谢,这很有帮助。@yugr嗨!我已经为Clang()提交了一个bug。因为我没有bugzilla帐户,所以我无法为gcc提交一个。我已经发送了一个帐户创建请求,我仍在等待答复。@yugr你好!这周我很忙,所以我创建了相应的gcc问题,但有些延迟。以下是链接:
/* note about displacement:
 * displace 0: at least one compiler treated 0 by not shifting it at all
 * displace by small value (8): caused ICE on certain mingw gcc versions */
reinterpret_cast<std::ptrdiff_t>(
    static_cast<Derived *>(
        reinterpret_cast<Base *>(1 << 20)
    )
) - (1 << 20)