我在多线程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?我应该用吗?
答案 0 :(得分:10)
写入NULL
地址并不能保证可靠地使您的程序崩溃,因此GCC introduced __builtin_trap
为此。
看起来clang决定更进一步,完全消除这些写法,几乎迫使你使用__builtin_trap
。与NULL
相比,将volatile
转换为__builtin_trap
指针的其他选项看起来并不具有吸引力,因为它“仅仅”是一种未定义的行为。
答案 1 :(得分:3)
该声明证明了未定义的行为。特别是编译器没有义务尝试在地址0
处存储某些内容并且可以优化它。这就是编译器告诉你的。
使用exit()
或abort()
或某些衍生产品来终止整个流程执行。这是便携式的。 (C11有exit
,_Exit
,quick_exit
和abort
)