Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Crashing threads with *(int*)NULL = 1; problematic?

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?

like image 350
Ynv Avatar asked Apr 14 '12 11:04

Ynv


2 Answers

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 casting NULL to volatile pointer does not look attractive compared to __builtin_trap, because it's "merely" an undefined behavior.

like image 173
Sergey Kalinichenko Avatar answered Nov 14 '22 21:11

Sergey Kalinichenko


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() or abort() or some of the derivatives to terminate the whole process execution. This is portable. (C11 has exit, _Exit, quick_exit and abort)

like image 28
Jens Gustedt Avatar answered Nov 14 '22 19:11

Jens Gustedt