gpt4 book ai didi

c++ - ASAN 检测到与动态加载的库共享的类的 vtable 的 ODR 违规

转载 作者:行者123 更新时间:2023-12-02 10:23:37 24 4
gpt4 key购买 nike

我正在开发一个项目,该项目有一个“util”库,其中包含日志记录、断言处理等内容。它被编译成一个带有 -fPIC 的静态库。添加。我还有一个插件系统,插件是在运行时通过dlopen加载的共享库。 .这些插件和主要可执行文件都使用静态 util 库。
问题:现在我得到 AddressSanitizer: odr-violation使用 ASAN 时出错。问题是 size=40 'vtable for StdStreamWriter'报告了两次,其中 StdStreamWriter 是静态库内部使用的接口(interface)的实现。
我非常努力地在 MWE 中重现这一点:

  • 创建一个暴露一些函数的静态库
  • 在其中使用 std::shared_ptr
  • 中的接口(interface)和实现
  • 创建一个共享库链接到
  • 创建一个针对静态库和 dlopen 的可执行链接共享库

  • CMakeLists.txt
    cmake_minimum_required(VERSION 3.8)
    project(proj)

    set(sanitizer_flags "-fsanitize=address,undefined -fno-omit-frame-pointer")
    string(APPEND CMAKE_CXX_FLAGS " ${sanitizer_flags}")
    string(APPEND CMAKE_EXE_LINKER_FLAGS " ${sanitizer_flags}")
    string(APPEND CMAKE_MODULE_LINKER_FLAGS " ${sanitizer_flags}")

    add_library(foo STATIC foo.cpp)
    target_compile_features(foo PUBLIC cxx_std_14)
    set_target_properties(foo PROPERTIES CXX_EXTENSIONS OFF POSITION_INDEPENDENT_CODE ON)
    add_library(lib SHARED lib.cpp)
    target_link_libraries(lib foo)
    add_executable(main main.cpp)
    target_link_libraries(main foo dl)
    但是,无论我多么努力,MWE 都不会出现此问题。
    我将差异追溯到 nm -C liblib.so | grep vtable 中的不同结果:
  • MWE(无 ODR 错误)显示 V vtable for Impl
  • 实际程序显示D vtable for StdStreamWriter

  • 我猜错误源于差异 D对比 V这导致 vtables 没有被合并。
    这种差异从何而来?这是什么时候决定的?我将共享库的链接命令剥离为基本要素( clang++-8 -shared -fsanitize=address,undefined -o <..> <all *.o and *.so> ),但仍然得到 D vtable而不是 V vtable .
    我还能尝试解决什么问题?

    最佳答案

    这很可能是由 known issue 引起的。在 Clang 的 Asan 实现中,它会使用 vague linkage 检测静态数据的错误 ODR 违规(通常是类 vtables 或 typeinfos)。

    作为一种解决方法,请尝试使用 -mllvm -asan-use-private-alias=1 进行编译也许在做export ASAN_OPTIONS=use_odr_indicator=1在运行您的代码之前。

    如果这解决了您的问题,请在上述问题中发表评论,以增加在上游一劳永逸地修复它的机会。

    关于c++ - ASAN 检测到与动态加载的库共享的类的 vtable 的 ODR 违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57390595/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com