崩溃线程*(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
, _Exit
, quick_exit
和abort
)