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

我在multithreadingc应用程序中发现了这一点。 作者评论说它用于在自定义断言函数中使线程崩溃。 海湾合作委员会对它很好,但是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? 我应该用吗?

写入NULL地址不能保证可靠地使程序崩溃,因此GCC为此引入了__builtin_trap

看起来clang决定走得更远,完全消除这样的写法,几乎迫使你使用__builtin_trap 。 与__builtin_trap相比,它们向volatile指针投射NULL另一种选择看起来并不吸引人,因为它“仅仅”是一种未定义的行为。

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

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