【发布时间】:2016-03-01 18:31:02
【问题描述】:
假设您知道您的软件只能在二进制补码机器上运行,其中有符号溢出行为得到了很好的定义。有符号溢出在 C 和 C++ 中仍然是未定义的行为,编译器可以随意用“ret”替换整个程序、发动核战争、格式化驱动器或让恶魔飞出你的鼻子。
假设你在内联 asm 中签名溢出,你的程序是否仍然调用 UB?
如果是,那么单独编译和链接的汇编器呢?
【问题讨论】:
-
这是一个非常有趣的问题。我也想知道。
-
首先内联汇编甚至是标准 C 或 C++ 吗?老实说,我不知道。如果不是,我觉得整个问题都站不住脚。
-
嗯,有 [dcl.asm]:
asm声明是有条件支持的;它的含义是实现定义的。 -
对于 C99,我发现的唯一内容是 asm 关键字:J.5.10 asm 关键字可用于将汇编语言直接插入翻译器输出 (6.8)。
-
很多未定义的行为实际上是由实现定义的。 “未定义的行为”不是意味着“实现必须使行为尽可能随机和邪恶”。
标签: c++ c assembly language-lawyer undefined-behavior