6

我在一个多线程的 c 应用程序中发现了这一点。作者评论说,它用于在自定义断言函数中使线程崩溃。GCC 没问题,但 clang 发出以下警告:

note: consider using __builtin_trap() or qualifying pointer with 'volatile'

并且还针对 assert 函数的每次使用发出其中一个:

warning: indirection of non-volatile null pointer will be deleted, not trap

这里发生了什么?__builtin_trap 是特定于 clang 的吗?我应该使用它吗?

4

2 回答 2

11

不能保证写入NULL地址会可靠地使您的程序崩溃,因此为此引入了 GCC__builtin_trap

看起来 clang 决定走得更远,完全消除此类写入,几乎迫使您使用__builtin_trap. NULL与 相比,他们转换为指针的其他选项volatile看起来并不吸引人__builtin_trap,因为它“仅仅是”未定义的行为。

于 2012-04-14T11:44:00.747 回答
3

该声明会引发未定义的行为。特别是编译器没有义务尝试在地址存储一些东西,0并且可以优化它。这就是编译器告诉你的。

使用exit()orabort()或一些派生类来终止整个流程的执行。这是便携式的。(C11 有exit, _Exit,quick_exitabort)

于 2012-04-14T11:42:29.000 回答