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

2023-11-27

我正在开发一个项目,它有一个“util”库,其中包含日志记录、断言处理等内容。它被编译成静态库-fPIC添加。我还有一个插件系统,其中插件是在运行时加载的共享库dlopen。这些插件和主要可执行文件都使用静态 util 库。

问题:现在我得到了AddressSanitizer: odr-violation使用 ASAN 时出错。问题是size=40 'vtable for StdStreamWriter'报告两次,其中 StdStreamWriter 是静态库内部使用的接口的实现。

我非常努力地在 MWE 中重现这一点:

  • 创建一个静态库,公开一些函数
  • 里面使用 std::shared_ptr 中的接口和实现
  • 创建一个共享库链接
  • 创建一个链接静态库的可执行文件并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 vs V这会导致 vtable 不被合并。

这种差异从何而来?这是什么时候决定的?我将共享库的链接命令精简为最基本的部分(clang++-8 -shared -fsanitize=address,undefined -o <..> <all *.o and *.so>)但仍然得到D vtable代替V vtable.

我还能尝试什么来解决这个问题?


这很可能是由已知问题在 Clang 的 Asan 实现中,它会使用以下命令检测静态数据的错误 ODR 违规模糊的联系(通常是类 vtable 或 typeinfo)。

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

如果这解决了您的问题,请在上述问题中发表评论,以增加在上游彻底解决该问题的机会。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASAN 检测到与动态加载库共享的类 vtable 的 ODR 违规 的相关文章

  • URL 的正则表达式

    我已经编写了正则表达式来验证 URL 它可以是这样的 example com www example com http www example com http www example com https www example com h
  • 有没有办法为向量采用内存资源?

    我已经开始在我的项目中使用 pmr allocators 并且我已经看到使用它们带来了很多性能提升和优势 我使用的分配器与我在下面的简单示例中展示的非常相似 include
  • 请求的资源不支持 HTTP 方法“GET”

    我的路线配置正确 并且我的方法具有装饰标签 我仍然收到 请求的资源不支持 HTTP 方法 GET 消息 System Web Mvc AcceptVerbs GET POST System Web Mvc HttpGet public st
  • 到底什么是“位填充”或“填充位”?

    我只是在互联网上找不到任何关于 位填充 真正含义的详细解释 并且在 Stack Overflow 上也没有找到与位填充相关的线程的任何答案 我还搜索了 ISO 9899 1990 其中提到了 位填充 但没有根据我的需要进行解释 我在网上找到
  • 在 C# 中实例化 python 类

    我已经用 python 编写了一个类 我想通过 IronPython 将其包装到 net 程序集中 并在 C 应用程序中实例化 我已将该类迁移到 IronPython 创建了一个库程序集并引用了它 现在 我如何真正获得该类的实例 该类看起来
  • 如何在函数中将结构成员作为指针传递?

    问题是我有一个结构是另一个 主要 结构的成员 我编写了一个函数来清除第一个结构 它需要一个指向结构的指针 我想使用该函数来清除主要结构内的结构 但我不确切知道哪种方法是正确的 为了更好地解释它 这里有一些代码 我有一个结构 定义为 type
  • 如何使用 saxon 将文档类型参数传递给 xslt?

    对于发送原子数据类型将使用类似 transformer SetParameter new QName customXml new XdmAtomicValue true 如何将 XML Node 作为参数从 C 传递给 XSLT 你能帮我么
  • ASP .NET MVC 5 - 客户地址一对一关系

    我在这里查看了论坛 实际上发现了一些类似的问题 但不是相同的问题 类似的解决方案没有给我正确的答案 我正在使用实体框架和代码优先方法来处理 ASP NET MVC 5 我想建立客户 gt 地址一对一关系的模型 我建模的是 客户等级 publ
  • 为什么 CMake 不通过在定义该变量之前创建的 CMAKE_CXX_STANDARD 将语言标准编译标志添加到目标?

    我在用着cmake version 3 22 1 and c Ubuntu 11 3 0 1ubuntu1 22 04 11 3 0 以及非常简约的CMakeLists txt 我无法让 CMAKE 使用 C 20 Setting set
  • 输入缓冲区刷新

    考虑下面的代码 include
  • 如何使用 ASP.NET MVC 4.0 DonutOutputCache VaryByCustom 使缓存失效

    我正在为我的 ASP NET 应用程序使用 DevTrends MvcDonutCaching 包 它工作得很好 我目前遇到的一个问题是使我为子操作设置的 VaryByCustom 缓存无效 这是我用于 VaryByCustom 设置的一些
  • 使用 microsoft word.interop 删除 Word 文档中的空白页

    我创建了一个Word文档 它使用以下命令生成动态内容词互操作 它有一些分页符之间使用 我面临的问题是 此分页符会创建我不想向用户显示的空白页面 在某些情况下 我需要在那里添加这些分页符以维护页面布局 因此我无法考虑删除这些分页符 但我想要的
  • C# 列表框 ObservableCollection

    我正在尝试使用 ListBox DataSource ObservableCollection 但是我不知道如何在 OC 更新时让列表框自动更新 我可以在 OC 上挂接 CollectionChanged 事件 但是我需要对列表框执行什么操
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • 在 C# 4.0 中,是否可以从泛型类型参数派生类?

    我一直在尝试这个 但我似乎无法弄清楚 我想做这个 public abstract class SingletonType
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • 当“多次安装 MSBuild”时,Dotnet 项目转换尝试转换失败

    try convert w Test csproj target framework netstandard2 0 结果是 Multiple installs of MSBuild detected please select one In
  • STL 向量、迭代器和插入 (C++)

    我有一个将向量的迭代器传递到的方法 在这个方法中 我想向向量中添加一些元素 但我不确定当只有迭代器时这是否可行 void GUIComponentText AddAttributes vector
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • 任何浮点密集型代码是否会在任何基于 x86 的架构中产生位精确的结果?

    我想知道使用浮点运算的 C 或 C 代码是否会在任何基于 x86 的体系结构中产生位精确的结果 无论代码的复杂性如何 据我所知 自 Intel 8087 以来的任何 x86 架构都使用准备处理 IEEE 754 浮点数的 FPU 单元 并且

随机推荐

  • 使用XPath解析包含冒号的元素名称

    所以我试图解析一些WootAPI使用 XPath 我遇到的一个问题是一些元素的名称中带有冒号 例如woot price or woot condition 现在 尝试使用 XPath rss channel item woot price不
  • 方法 ob_start 和 ob_flush 不起作用,为什么?

    我在用ob start ob flush 希望能够在漫长的导入操作中给我带来一些进展 这是我正在做的事情的简单概述
  • 使用 autocrlf=true 的 Git 按原样检查具有混合行结尾的文件

    所以 我一直认为与core autocrlf trueGit 替换所有LF结尾为CRLF将文件检出到工作目录时 来自Git book 如果您使用的是 Windows 计算机 请将其设置为 true 当您签出代码时 这会将 LF 结尾转换为
  • Matplotlib - 在值为 z 的线上标记点 (x,y)

    我正在尝试使用 pyplot 绘制二维图 我正在读取一个包含多列的文件 每列包含 1 到 10 之间的大约 100 个值 我将第 5 列与第 6 列进行比较 这很好 我还想做的是用第 0 列中的整数值标记结果行 因此 该行将在位置 x y
  • Rails 或 Bundle exec Rails s

    在 Rails 3 中确实如此rails s调用捆绑器 这样你就不需要做bundle exec rails s or is bundle exec需要运行rails s在您的应用程序 Gemfile 环境中 Update据了解bundle
  • 您应该如何构建您的 xml 文件? [复制]

    这个问题在这里已经有答案了 创建新的 xml 文件时 如何正确或最好的方式构建文件 在这种情况下 结构可能不是最好的词 我的意思是如何在将某物作为元素或元素的属性之间进行选择 例如 如果我创建一个包含人员列表的 Person xml 文件
  • Blink 内存缓存存储什么?

    除了浏览器缓存之外 浏览器还有其他几种缓存数据的方式 对于Chrome来说 渲染引擎中还有另外一个缓存Blink在内存中存储图像 样式 脚本和字体 也许更多 此缓存用于站点上的连续导航 从 Blink 缓存传递的资源标记为 from mem
  • 导入错误:没有名为 numpy 的模块

    我正在尝试运行一个需要安装 Numpy 的程序 我想是的 因为如果我尝试sudo apt get install python numpy它告诉我 sudo apt get install python numpy Reading pack
  • 从 HTTP 重定向到 HTTPS - IIS 7.5

    我已经在我的应用程序上实现了 https 现在我正在尝试使 IIS 将所有 http 请求重定向到 https 以便用户甚至不会注意到此更改 我已经更改并尝试了一些 IIS 选项 但没有成功 我怎样才能做到这一点 我正在使用 IIS 7 5
  • C# ASP.NetParameters.AddWithValue 拒绝参数的空值

    我正在使用存储过程填充表 该表允许名称的中间首字母为 null 但我收到以下错误消息 过程或函数 uspInsertPersonalAccountApplication 需要参数 MiddleInitial 但未提供该参数 提前致谢 pub
  • 检查 UIScrollView 是否到达顶部或底部

    有没有办法知道是否UIScrollView已经到达顶部还是底部 可能在方法中 void scrollViewDidEndDragging UIScrollView scrollView willDecelerate BOOL deceler
  • R - 使用 x 和 y 数据绘制幂律线

    我正在尝试绘制幂律线来拟合数据框中已有的 x 和 y 数据 我已经在 igraph 库中尝试过 power law fit 但它不起作用 数据框是 dat data frame x 1 8 ygm c 251 288 167 739 112
  • 检测ajax调用,ASP.net

    如何在 ASP net 应用程序的服务器端检测请求是否是 AJAX 请求 来自 jQuery 我不想这样做 mypage aspx this is ajax true ex get mypage aspx 在服务器端 当请求是 ajax 请
  • 在 PHP 中使用 ' 代替撇号(')

    我尝试将文本转换为 utf8 或从 utf8 转换 但这似乎没有帮助 我越来越 It s Getting the Best of Me 它应该是 It s Getting the Best of Me 我从以下位置获取这些数据这个网址 要转
  • 在新的 matlab 版本上运行旧的 mex 文件

    我正在尝试在新版本 R2009a 上运行最初在 Matlab 6 5 上测试的程序 该程序使用一些 mex 文件 在尝试运行它时出现以下错误 无效的 MEX 文件 normalizedCut common files sparsifyc m
  • Android:导航到父活动重新创建父活动

    我有一个 SearchActivity 它有一个子 PersonActivity 每个都是 FragmentActivity 的 这是我的清单文件
  • Android 3.2 从操作栏中删除标题

    我正在使用 eclipse android 3 2 以及运行 android x86 的虚拟机 v3 2 我使用 Holo 主题 我想删除操作栏标题和图标 所以我这样做 Override public void onCreate Bundl
  • Facebook 在首次分享时忽略了 OG 图片

    我正在开发一个 WordPress 网站 并使用 yoast seo 插件在动态页面上生成 og 图像 不过 我认为这与此无关 og 图像链接显示完美 但如果我单击共享按钮 则不会包含任何图像 除非我之前已经单击过共享按钮 或者首先使用 f
  • Rails 中的资产/图像没有路由匹配

    在导轨上工作时 图像不可见并给出错误 Started GET assets home png for 127 0 0 1 at 2012 06 19 12 23 24 0530 Served asset home png 404 Not F
  • ASAN 检测到与动态加载库共享的类 vtable 的 ODR 违规

    我正在开发一个项目 它有一个 util 库 其中包含日志记录 断言处理等内容 它被编译成静态库 fPIC添加 我还有一个插件系统 其中插件是在运行时加载的共享库dlopen 这些插件和主要可执行文件都使用静态 util 库 问题 现在我得到