由 lambda 包装器对可变参数模板函数调用引起的 gcc 分段错误

2023-12-19

我今天花了好几个小时试图理解为什么这段代码 http://melpon.org/wandbox/permlink/HfrjVkob1QP476QT出现段错误g++6.2 and g++7.0,同时按预期愉快地工作clang++3.9 (and 4.0).

我将问题简化为85 行独立代码片段 http://melpon.org/wandbox/permlink/ACW1w5CDsyK6rSB6, which 没有段错误正常执行时,但是always在 UBSAN 下报告错误。

问题可在 wandbox 上重现 http://melpon.org/wandbox/permlink/ACW1w5CDsyK6rSB6,通过编译g++7,实现优化和传递-fsanitize=undefined作为额外的标志。

这是 UBSAN 的报道:

prog.cc: In function 'int main()':
prog.cc:61:49: warning: 'ns#0' is used uninitialized in this function [-Wuninitialized]
         ([&] { ([&] { n.execute(ns...); })(); })();
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
prog.cc:28:10: note: 'ns#0' was declared here
     auto execute(TNode& n, TNodes&... ns)
          ^~~~~~~
prog.cc:30:9: runtime error: member call on null pointer of type 'struct node_then'

g++声称ns#0在“lambda 乱码”中未初始化(它模拟了for_tuple来自原始片段)。现在,发生了一些非常有趣的事情:

  • 如果我删除“lambda 胡言乱语”,则转换line 61 into

     n.execute(ns...);
    

    然后 UBSAN 就不再抱怨了。

  • If 我将捕获列表更改为[&] to [&n, &ns...],UBSAN 也停止抱怨:

     ([&](auto) { ([&n, &ns...] { n.execute(ns...); })(); })(0);
    

    ...等等什么?这和有什么不同[&]?

将上述发现应用到原始代码片段中修复段错误 http://melpon.org/wandbox/permlink/pEs8JcvKpp723vd3.

这是一个g++漏洞?或者我的代码中有任何未定义的行为?


这无关与临时的 http://melpon.org/wandbox/permlink/dT6dHxuaEqgvA3Be:这是一个 gcc7.0 优化器错误。这是一个更简单的再现器:

#include <utility>

struct root
{
  template <typename TNode, typename... TNodes>
  void start(TNode n, TNodes... ns)
  {
    n->execute(ns...);
  }
};

template <typename TParent>
struct node_then
{
  TParent *_p;

  node_then(TParent *p) : _p{ p }
  {
  }

  auto execute()
  {
  }

  template <typename TNode, typename... TNodes>
  auto execute(TNode n, TNodes... ns)
  {
    n->execute(ns...);
  }

  template <typename... TNodes>
  auto start(TNodes... ns)
  {
    _p->start(this, ns...);
  }
};

template <typename TParent>
struct node_wait_all
{
  TParent *_p;

  node_wait_all(TParent *p) : _p{ p }
  {
  }

  template <typename TNode, typename... TNodes>
  auto execute(TNode n, TNodes... ns)
  {
    ([&] { ([&] { n->execute(ns...); })(); })();
  }

  template <typename... TNodes>
  auto start(TNodes... ns)
  {
    _p->start(this, ns...);
  }
};


int main()
{
  //node_wait_all<root> obj(new root());
  //node_then<node_wait_all<root>> obj2(new node_wait_all<root>(new root()));
  node_then<node_then<node_wait_all<root>>> obj3(new node_then<node_wait_all<root>>(new node_wait_all<root>(new root())));
  obj3.start();
}

Output:

prog.cc: In function 'int main()':
prog.cc:67:1: internal compiler error: in visit_ref_for_mod_analysis, at ipa-prop.c:2308
 }
 ^
0x96c4d6 visit_ref_for_mod_analysis
    /home/heads/gcc/gcc-source/gcc/ipa-prop.c:2308
0x8f615d walk_stmt_load_store_addr_ops(gimple*, void*, bool (*)(gimple*, tree_node*, tree_node*, void*), bool (*)(gimple*, tree_node*, tree_node*, void*), bool (*)(gimple*, tree_node*, tree_node*, void*))
    /home/heads/gcc/gcc-source/gcc/gimple-walk.c:817
0x9761a2 ipa_analyze_params_uses_in_bb
    /home/heads/gcc/gcc-source/gcc/ipa-prop.c:2335
0x9761a2 analysis_dom_walker::before_dom_children(basic_block_def*)
    /home/heads/gcc/gcc-source/gcc/ipa-prop.c:2415
0x10c8472 dom_walker::walk(basic_block_def*)
    /home/heads/gcc/gcc-source/gcc/domwalk.c:265
0x977ceb ipa_analyze_node(cgraph_node*)
    /home/heads/gcc/gcc-source/gcc/ipa-prop.c:2486
0x1108f0a ipcp_generate_summary
    /home/heads/gcc/gcc-source/gcc/ipa-cp.c:5036
0xa4759c execute_ipa_summary_passes(ipa_opt_pass_d*)
    /home/heads/gcc/gcc-source/gcc/passes.c:2167
0x7d6b45 ipa_passes
    /home/heads/gcc/gcc-source/gcc/cgraphunit.c:2311
0x7d6b45 symbol_table::compile()
    /home/heads/gcc/gcc-source/gcc/cgraphunit.c:2425
0x7d8616 symbol_table::compile()
    /home/heads/gcc/gcc-source/gcc/cgraphunit.c:2587
0x7d8616 symbol_table::finalize_compilation_unit()
    /home/heads/gcc/gcc-source/gcc/cgraphunit.c:2584
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.

Link: http://melpon.org/wandbox/permlink/E11fOumFJda6OW6m http://melpon.org/wandbox/permlink/E11fOumFJda6OW6m

为了帮助理解这段代码,我使用了一个强大的调试工具:paint.exe

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

由 lambda 包装器对可变参数模板函数调用引起的 gcc 分段错误 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • 基于 If-Modified-Since 标头修改 REST API 表示是否有效?

    我想在我的 API 中实现 获取更改值 功能 例如 假设我有以下 REST API 调用 GET ws school 7 student 这得到了 7 学校的所有学生 不幸的是 这可能很多 因此 我想修改 API 以仅返回自特定时间以来已修
  • 为什么每次我运行/调试我的应用程序时,RubyMine 2.0.2 都会在不同的端口上启动 Webrick?

    每次我在 RubyMine 下启动 Rails 2 3 8 Web 应用程序时 它都使用不同的端口 这让我很生气 因为每次我想测试某些东西时都必须更改浏览器中的 URL 我找不到任何配置选项来更改它 任何人 这可能没有帮助 因为我使用的是
  • 当变量明确存在时,Javassist 没有这样的字段

    我正在尝试使用 javassist 将代码注入到 minecraft 1 8 jar 中 这insertBefore insertAfter方法工作得很好 但 insert at 方法并没有按预期工作 我收到此错误 https gist g
  • C strndup 隐式声明

    我正在尝试使用strndup函数 但我收到错误 错误 函数 strndup 的隐式声明 Werror 隐式函数声明 我四处搜索 发现它不是标准函数 因此我必须使用不同的标志进行编译 但是 我通过编译以下内容收到了同样的问题 std gnu1
  • 为孩子们建立安全的搜索引擎?

    我今年的项目 为孩子们建立安全的搜索引擎 所以我需要一些信息 1 在哪里可以找到有关该主题的一些研究 论文 2 如何利用开源工具 3 我的项目需要学习哪些技术 和一些建议请 thanks 更新 安全意味着当孩子们搜索任何内容时他们看不到相关
  • PHP 从数据库中下拉数据

    我正在尝试做一个select field根据我的数据库获取数据 所以 基本上 我希望它为我的数据库中的所有用户提供一个下拉菜单 所以就像而不是这样做
  • 导入错误:无法导入名称“keras”

    在 Jupyter 笔记本 python 中运行此命令时 import tensorflow as tf from tensorflow import keras 我收到此错误 ImportError cannot import name
  • C# 中的字符串将单引号替换为双引号

    如何在 C 字符串中用双引号 替换单引号 您需要对引号符号使用正确的转义序列 您可以找到有关转义序列的更多信息here http msdn microsoft com en us library h21280bw aspx String s
  • Android:应用程序关闭后将值保留在列表中

    我目前正在尝试开发一个用作购物清单的应用程序 用户在其中输入文本EditText 按Button 然后将该值保存到List 然后更新ListView以其价值 该应用程序运行良好 除非用户退出应用程序 在这种情况下 用户输入的所有值都不会保存
  • nginx.conf 中的 http 指令错误

    这就是我的 home ubuntu project nginx conf好像 http configuration of the server server the port your site will be served on list
  • 在 WPF Treeview 中搜索特定的 TreeViewItem

    我正在使用 wpfTreeView 我正在尝试搜索中的所有项目TreeView找到想要的TreeViewItem在其中 my code parent is a string我正在搜索的所需项目的标题 foreach TreeViewItem
  • ios 设置中缺少设备管理

    我正在尝试在 Xcode 中构建我的项目 它工作得很好 但最后我收到一条警告 验证您的帐户的开发者应用程序证书在您的设备上受信任 在 Artium 的 iPhone 上打开 设置 并导航至 常规 gt 设备管理 然后选择您的开发者应用程序证
  • Fork-exec 管道重定向问题

    谁能告诉我这段代码有什么问题吗 总之 它创建输入和输出管道 而 fork exec 的sort程序 家长读字典 usr share dict words并将其写入管道dup2 d to sort的标准输入 同样 读取它的输出 将其打印到终端
  • JavaScript Ascii 编码

    如何使用 ASCII 编码将 JavaScript 字符串转换为字节数组 在 C 中 它是这样完成的 var encoding new System Text ASCIIEncoding byte keyByte encoding GetB
  • 在浏览器中训练后,将模型合并并保存在tensorflow.js中

    我正在关注tensorflow jstutorial https codelabs developers google com codelabs tensorflowjs teachablemachine codelab index htm
  • 带时间延迟的单步遍历数组

    我的页面上有选项卡 每个选项卡都包含独特的内容 我想自动旋转选项卡和内容而不点击它们 页面加载后我希望这个函数开始使用window onload function 我有以下 JavaScript 数组 var HomeTabs 1 3 5
  • Create React App 4.0无法解析公共文件夹中的图像路径

    我已经升级到最新的Create React App 4 0 现在scss无法解析公用文件夹中的图像资源 我之前使用的是CRA 3 4 1 效果很好 有任何想法吗 我不想用npm eject icon svg 位于public images
  • 不同行的html表格单元格宽度[重复]

    这个问题在这里已经有答案了 可能的重复 表格单元格宽度问题 https stackoverflow com questions 5937774 table cell width issue 我有一张桌子设置为 table width 100
  • 将 log4j 与 JBoss 7.1 结合使用

    如何将 log4j 与 JBoss 7 1 一起使用 我的 WebContent WEB INF lib 文件夹中有一个 log4j 1 2 16 jar 当我输出结果时Logger getRootLogger getClass toStr
  • 由 lambda 包装器对可变参数模板函数调用引起的 gcc 分段错误

    我今天花了好几个小时试图理解为什么这段代码 http melpon org wandbox permlink HfrjVkob1QP476QT出现段错误g 6 2 and g 7 0 同时按预期愉快地工作clang 3 9 and 4 0