使用替换的运算符 new 进行 Clang 链接时优化会导致 valgrind 中的 free()/delete 不匹配

2023-11-24

当使用 clang 3.5.0 和 -flto 并链接到共享库时,似乎调用operator delete在共享库中不遵循与调用相同的符号解析顺序operator new从主要对象来看。例子:

共享.cpp:

void deleteIt(int* ptr) {
  delete ptr;
}

main.cpp:

#include <cstdlib>
#include <new>

void* operator new(size_t size) {
  void* result = std::malloc(size);
  if (result == nullptr) {
    throw std::bad_alloc();
  }
  return result;
}

void operator delete(void* ptr) noexcept {
  std::free(ptr);
}

void deleteIt(int* ptr);

int main() {
  deleteIt(new int);
  return 0;
}

以下是我构建它并通过 valgrind 运行它时发生的情况:

$ clang++ -std=c++11 -g -O3 -flto -fuse-ld=gold -fPIC -shared shared.cpp -o libshared.so
$ clang++ -std=c++11 -g -O3 -flto -fuse-ld=gold main.cpp -L. -lshared -o main
$ LD_LIBRARY_PATH=. valgrind --quiet ./main
==20557== Mismatched free() / delete / delete []
==20557==    at 0x4C2B6D0: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20557==    by 0x4009F7: main (main.cpp:19)
==20557==  Address 0x5a03040 is 0 bytes inside a block of size 4 alloc'd
==20557==    at 0x4C29F90: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20557==    by 0x4009EA: operator new (main.cpp:5)
==20557==    by 0x4009EA: main (main.cpp:19)
==20557== 

你可以看到它正在寻找 valgrindoperator delete,但是使用operator new from main.cpp。相比之下,与 gcc 完全相同的构建(只需替换clang++ with g++) 工作正常。任何想法为什么,或者如何解决它?

编辑:符号导入和导出,按照@Deduplicator 的要求。

$ objdump -T main | c++filt | grep operator
0000000000400990 g    DF .text  0000000000000033  Base        operator new(unsigned long)
0000000000000000      DF *UND*  0000000000000000  Base        operator delete(void*)
$ objdump -T libshared.so | c++filt | grep operator
0000000000000000      DF *UND*  0000000000000000  GLIBCXX_3.4 operator delete(void*)

看着对象转储, 这很明显operator delete(void*)不由导出main.

$ objdump -T main | c++filt | grep operator
0000000000400990 g    DF .text  0000000000000033  Base        operator new(unsigned long)
0000000000000000      DF *UND*  0000000000000000  Base        operator delete(void*)

请参阅该部分operator delete(void*)存储的是*UND*: 没有啊!

现在,这对于 clang 来说是一个明显的失败,可能会成为一个很好的错误报告,因为我们已经有了一个最小的测试用例。

现在,如何强制 clang 保留并导出operator delete(void*)作为创可贴?
答案是查看可能的属性,有一个很好的:

used
此属性附加到函数,意味着即使该函数似乎未被引用,也必须为该函数发出代码。例如,当仅在内联汇编中引用该函数时,这很有用。 当应用于 C++ 类模板的成员函数时,该属性还意味着如果类本身被实例化,则该函数也会被实例化。

将其放入代码中:

void operator delete(void* ptr) noexcept  __attribute__((used)) {

瞧, clang 不再不恰当地修剪它。

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

使用替换的运算符 new 进行 Clang 链接时优化会导致 valgrind 中的 free()/delete 不匹配 的相关文章

  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959

随机推荐

  • 从jade内部获取用户代理

    我正在尝试将我为groovy编写的脚本移植到jade 但遇到了绊脚石 我需要从玉文件内部访问用户代理 这是我到目前为止所尝试过的 var agent req headers user agent var agent headers user
  • 有没有办法为@AllArgsConstructor(lombok)的所有参数设置“not null”

    我正在使用 AllArgsConstructor我的类中的注释并希望确保参数不为空 有没有办法修改这个注释来实现这一点 或者我应该实现构造函数 谢谢 Getter Setter ToString AllArgsConstructor pub
  • 如何在 UIlabel 中将上标 % 字符显示为字符串?

    如何在 UIlabel 中将上标 字符显示为字符串 我知道 在 unicode 中不存在作为上标 但是有什么方法我们可以将 显示为上标而不是使用 html 标签 我在 Stackoverflow 上找到了这篇关于使用属性字符串的上标样式文本
  • Scala 数组与向量

    Scala 新手 我很困惑 object myApp extends App println Echo args mkString args 是Array String 类型 但在scaladoc中 Array没有这样的方法 mkStrin
  • Codeigniter JOIN(SELECT 查询

    可以通过 CI 查询生成器类生成以下查询吗 SELECT name FROM table1 t1 JOIN SELECT ID FROM table2 ORDER BY id LIMIT 5 t2 ON t2 id t1 t2 id WHE
  • Dart 错误:错误:当前 Dart 运行时不支持导入 dart:mirrors

    我目前正在尝试使用 Flutter 编写一些移动代码 我正在尝试使用 gcloud 库 dart 将数据发布 订阅到 GCP Cloud Pub Sub 这是 main dart 的代码 import dart io import pack
  • 如何将 ZF2 与 Doctrine Mongo ODM 集成? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在尝试将zf2 beta3与doctrine mongo odm https git
  • 使用 lambda 表达式获取属性名称和类型

    我正在尝试编写一个函数 该函数将使用如下语法提取属性名称和类型 private class SomeClass Public string Col1 PropertyMapper
  • std::ofstream::write 添加字符

    我正在尝试使用编写二进制文件std ofstream write方法 我发现 有些字符不是按原样写的 例如 std ofstream in testout int i 10 in write const char i sizeof i in
  • 在 DX10/DX11 中使用多个顶点缓冲区

    我有一个我一直在编写的 C DirectX 11 渲染器 我编写了一个 COLLADA 1 4 1 加载程序来导入 COLLADA 数据以用于支持骨骼动画 我此时正在验证加载程序 并且我之前在我之前使用不同技术编写的另一个渲染器中支持过 C
  • 如何调试 OBB 扩展包已替换为 PAD(Play Asset Delivery)的应用程序?

    渴望淘汰我们的应用程序老化的 OBB 扩展包系统并用闪亮的新的替换它游戏资产交付 PAD 以前称为动态资产交付 我一直在关注文档 但我对下一步该做什么感到困惑 如何到达可以点击 调试 并找到准备就绪的资源的位置 就像过去我的 OBB 在手机
  • 异步函数上的 setTimeout

    我有一个异步函数 我希望在被触发之前有 5000 毫秒的延迟 我正在尝试使用setTimeout 为了达成这个 该异步函数发生在运行多次的循环中 每次都向异步函数传递不同的数据 因此setInterval 不能在这里使用 Problem 异
  • 扩展方法 - 装饰器模式

    我想知道我们是否可以将扩展方法视为 C 中装饰器模式的实现 因为目标是相同的 但实施逻辑以及概念可能不同 Thanks 装饰器模式通常与独立于其他实例向特定类型实例添加行为相关 对于扩展方法 它会影响在同一范围内编译的类型的所有实例 我认为
  • GitLab:如何以编程方式下载 CI 管道末尾发布的工件?

    在 Gitlab 中 如何以编程方式下载 CI 管道末尾发出的工件 通过 UI 下载很容易 但是如何通过 API 获取呢 换句话说 是否可以通过令牌或类似的东西来访问它 可以通过 API 来实现 如下所示https docs gitlab
  • 使用任务计划程序找不到文件

    In my C code 我引用了一个 XML 文件 文件 xml 它与可执行文件本身位于同一目录中 使用 XmlDocument 该应用程序在 VS 中运行得很好 但是当我尝试使用任务计划程序运行该应用程序时 我得到了一个System I
  • 在网格视图中显示包含列表的对象列表

    我目前正在开发一个书签管理器应用程序 Windows 窗体 具有高级搜索功能 我创建了一个Links类 每次用户输入 URL 时 我都会创建一个 Link 对象并将详细信息存储在那里 目前它有以下属性Name URL and Tags wh
  • R 中 qnorm() 函数

    我已阅读有关的文档qnorm 但无法真正理解它的作用 你能详细回答一下什么吗qnorm does 注意 请原谅我问这么简单的问题 我是 R 初学者 功能qnorm 旨在找到边界值 AP X lt A 给定概率 P 例如 假设您想要查找平均值
  • Django-OAuth-ToolKit :使用 OAuth2.0 的客户端凭据授予类型为多个资源/服务生成访问令牌

    我有几个后端 API 它们是 Django 项目 他们有一个用户界面 单页应用程序 和一个基于用户名密码的登录 我的客户通常是开发人员 他们不需要 UI 他们想要的只是访问后端 API 并且他们可以构建自己的仪表板等 他们希望将 API 与
  • 修复损坏的 neo4j 数据库(2.3.2 社区)

    我的 neo4j 2 3 2 community 数据库磁盘空间不足 80G 我彻底关闭了它 然后添加了更多磁盘 并尝试重新启动它 结果却收到神秘的错误消息 并且它拒绝启动 今天早上 当我意识到磁盘已满并且不再接受任何插入时 我将其关闭 直
  • 使用替换的运算符 new 进行 Clang 链接时优化会导致 valgrind 中的 free()/delete 不匹配

    当使用 clang 3 5 0 和 flto 并链接到共享库时 似乎调用operator delete在共享库中不遵循与调用相同的符号解析顺序operator new从主要对象来看 例子 共享 cpp void deleteIt int p