【问题标题】:"Illegal hardware instruction" from very simple code来自非常简单的代码的“非法硬件指令”
【发布时间】:2020-03-23 14:15:43
【问题描述】:

在调查a dubious claim时,我写了这个小测试程序noway.c

int proveit()
{
    unsigned int n = 0;
    while (1) n++;
    return 0;
}

int main()
{
    proveit();
    return 0;
}

对此进行测试,我得到:

$ clang -O noway.c
$ ./a.out
zsh: illegal hardware instruction  ./a.out

笏。

如果我在没有优化的情况下进行编译,它会按预期挂起。我查看了程序集,没有花里胡哨的 main 函数看起来像这样:

_main:                                  ## @main
    pushq   %rbp
    movq    %rsp, %rbp
    ud2

ud2 显然是专门针对未定义行为的指令。前面提到的可疑声明,“永远不会返回的函数是 UB”,得到了加强。我仍然觉得很难相信。真的!?您不能安全地编写自旋循环吗?

所以我想我的问题是:

  1. 这是对正在发生的事情的正确解读吗?
  2. 如果是这样,有人可以向我指出一些可以验证它的官方资源吗?
  3. 您希望在什么情况下进行这种优化?

相关信息

$ clang --version
Apple clang version 11.0.0 (clang-1100.0.20.17)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

【问题讨论】:

  • IIRC,有符号整数溢出是 UB。
  • ^^^^ 即int n = 0 ===> unsigned int n = 0; 或者更好.. while (1);
  • Hmmm... 编译器资源管理器 clang 获得带有 -O gcc.godbolt.org/z/NTCQYT 的自目标跳转指令和没有它的逐行翻译。在许多版本中似乎都是一致的。但我还记得(虽然不会查)C 标准说非终止是 ub 如果它没有副作用。 Hans Boehm 解释说,这允许某些原本不可能的编译器优化:open-std.org/jtc1/sc22/wg14/www/docs/n1528.htm
  • 未定义的行为是有符号整数溢出,而不是无限循环。您可以使用unsigned int 修复它
  • @Gene 我不认为它这么说。可以假定具有非常量控制表达式的无副作用循环终止 (port70.net/~nsz/c/c11/n1570.html#6.8.5p6),但繁忙的循环应该没问题。 UB 处于整数溢出中,但我无法使用 UD 指令重现该示例。

标签: c standards undefined-behavior


【解决方案1】:

如果您获得了当前问题代码的 ud2,则编译器不是符合标准的 C 编译器。您可以报告编译器错误。

请注意,在 C++ 中,此代码实际上是 UB。添加线程时(分别为 C11 和 C++11),为任何线程(包括非多线程程序的主执行线程)设置了向前进度保证。

在 C++ 中,所有线程最终都必须进行,没有例外。然而,在 C 中,控制表达式为常量表达式的循环不需要进行。我的理解是 C 添加了这个异常,因为在嵌入式编码中使用while(1) {} 来挂起线程已经是常见的做法。

Similar question with more detailed answers

【讨论】:

  • 是的,我确实从 C 代码中得到了 ud2,但感谢您提供有关 C++ 前进进度保证的信息(我似乎可以研究这个术语),这就是我的初衷真的在问,但在我准备问题时得到了,呃,优化了。
  • 我认为标准委员会试图表达的更好的措辞是,如果将循环中的所有内容推迟到某个操作之后不会明显影响程序行为,则推迟整个循环的执行超过该操作将不会被视为可观察到的行为变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
相关资源
最近更新 更多