assert(0) behavior
Steven Schveighoffer via Digitalmars-d
digitalmars-d at puremagic.com
Mon Aug 3 07:35:02 PDT 2015
If you compile and run the following code, what happens?
void main()
{
assert(0, "error message");
}
answer: it depends. On OSX, if you compile this like so:
dmd testassert.d
./testassert
You get this message + stack trace:
core.exception.AssertError at testassert.d(3): error message
Not bad. But assert(0) is special in that it is always enabled, even in
release mode. So let's try that:
dmd -release testassert.d
./testassert
Segmentation fault: 11
WAT. The explanation is, assert(0) is translated in release mode to a
HLT instruction. on X86, this results in a segfault. But a seg fault is
tremendously less useful. Let's say you are running a 10k line program,
and you see this. Compared with seeing the assert message and stack
trace, this is going to cause hours of extra debugging.
Why do we do this? I'm really not sure. Note that "error message" is
essentially not used if we have a seg fault. Throwing an assert error
shouldn't cause any issues with stack unwinding performance, since this
can be done inside a nothrow function. And when you throw an
AssertError, it shouldn't be caught anyway.
Why can't assert(0) throw an assert error in release mode instead of
segfaulting? What would it cost to do this instead?
-Steve
More information about the Digitalmars-d
mailing list