null dereference exception vs. segfault?
Steven Schveighoffer
schveiguy at yahoo.com
Mon Aug 2 05:29:36 PDT 2010
On Mon, 02 Aug 2010 00:59:42 -0400, Ryan W Sims <rwsims at gmail.com> wrote:
> The following code fails with a "Bus error" (OSX speak for "Segfault,"
> if I understand correctly).
>
> // types.d
> import std.stdio;
>
> class A {
> int x = 42;
> }
>
> void fail_sometimes(int n) {
> A a;
> if (n == 0) {
> a = new A; // clearly a contrived example
> }
> assert(a.x == 42, "Wrong x value");
> }
>
> void main() {
> fail_sometimes(1);
> }
>
> It's even worse if I do a 'dmd -run types.d', it just fails without even
> the minimalistic "Bus error." Is this correct behavior? I searched the
> archives & looked at the FAQ & found workarounds (registering a signal
> handler), but not a justification, and the threads were from a couple
> years ago. Wondering if maybe something has changed and there's a
> problem with my system?
I'm not familiar with dmd -run, but you should be aware that asserts are
not compiled into release code.
Try changing the assert to this:
if(a.x != 42) writeln("Wrong x value");
FWIW, D does not have null pointer exceptions, even in debug mode. It's
an oft-debated subject, but Walter hasn't ever budged on it. His view is
that you should use a debugger to see where your code is failing. We have
pointed out countless times that often it's not possible to have a
debugger at hand, or even be able to reproduce the issue that caused the
segfault while in a different environment. I don't know if we'll ever see
null pointer exceptions, but I'd love them in debug mode only, or at least
to see a stack trace when it occurs. The latter can be done without
Phobos/dmd help if someone can write such a signal handler function. I
don't know enough about stack traces to understand how to do it.
-Steve
More information about the Digitalmars-d-learn
mailing list