使用*(int *)NULL = 1崩溃线程;有问题?

时间:2012-04-14 11:29:42

标签: c clang assert volatile gcc-warning

我在多线程c应用程序中发现了这一点。作者评论说它用于在自定义断言函数中使线程崩溃。海湾合作委员会对它很好,但是clang发出以下警告:

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

并且对于断言函数的每次使用也会发出其中一个:

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

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

2 个答案:

答案 0 :(得分:10)

写入NULL地址并不能保证可靠地使您的程序崩溃,因此GCC introduced __builtin_trap为此。

看起来clang决定更进一步,完全消除这些写法,几乎迫使你使用__builtin_trap。与NULL相比,将volatile转换为__builtin_trap指针的其他选项看起来并不具有吸引力,因为它“仅仅”是一种未定义的行为。

答案 1 :(得分:3)

该声明证明了未定义的行为。特别是编译器没有义务尝试在地址0处存储某些内容并且可以优化它。这就是编译器告诉你的。

使用exit()abort()或某些衍生产品来终止整个流程执行。这是便携式的。 (C11有exit_Exitquick_exitabort