I found this in a multi-threaded c application. The authors commented that it's used to make a thread crash in a custom assert function. GCC is fine with it, but clang issues the following warning:
note: consider using __builtin_trap() or qualifying pointer with 'volatile'
and also issues one of those, for each usage of the assert function:
warning: indirection of non-volatile null pointer will be deleted, not trap
What is going on here? Is __builtin_trap specific to clang? Should I use it?
The statement provoques undefined behavior. In particular the compiler is not obliged to try to store something at address
0
and may optimize this out. This is what the compilers are telling you.Use
exit()
orabort()
or some of the derivatives to terminate the whole process execution. This is portable. (C11 hasexit
,_Exit
,quick_exit
andabort
)Writing to
NULL
address is not guaranteed to crash your program reliably, so GCC introduced__builtin_trap
for that.It looks like clang decided to go further, and eliminate such writes altogether, almost forcing you into using
__builtin_trap
. Their other option of castingNULL
tovolatile
pointer does not look attractive compared to__builtin_trap
, because it's "merely" an undefined behavior.