null dereference exception vs. segfault?

Ryan W Sims rwsims at gmail.com
Mon Aug 2 07:50:24 PDT 2010


On 8/2/10 1:56 AM, Jonathan M Davis wrote:
> On Sunday 01 August 2010 21:59:42 Ryan W Sims 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?
>>
>> --
>> rwsims
>
> You are getting a segmentation fault because you are dereferencing a null
> reference. All references are default initialized to null. So, if you fail to
> explicitly initialize them or to assign to them, then they stay null, and in
> such a case, you will get a segfault if you try to dereference them.

Yes, I know *why* I'm getting a segfault, thank you - I set up the 
example explicitly to defeat the compiler's null checking to test the 
behavior. I was startled that there wasn't an exception thrown w/ a 
stack trace.

[snip]

>
>
> Unlike Java, there is no such thing as a NullPointerException in D. You just get
> segfaults - just like you would in C++. So, if you don't want segfaults from
> derefencing null references, you need to make sure that they aren't null when
> you dereference them.
>
> - Jonathan M Davis

That was my question, thanks. It seemed like such an un-D thing to have 
happen; I was surprised. I guess w/o the backing of a full virtual 
machine, it's tricker to catch null dereferences on the fly, but boy 
it'd be nice to have. Don't want to re-fire the debate here, though.

--
rwsims


More information about the Digitalmars-d-learn mailing list