Looks like dereferencing a null pointer, but is ok???

Regan Heath regan at netwin.co.nz
Mon Sep 11 15:50:22 PDT 2006


On Mon, 11 Sep 2006 14:12:20 -0700, Sean Kelly <sean at f4.ca> wrote:
> Georg Wrede wrote:
>> In an old message,
>>
>>>> I don't think that any extra overhead is involved in slicing. D  
>>>> doesn't even check if a pointer is valid.
>>>> (That might be a gotcha come to think of it)
>>>>
>>>> void main()
>>>> {
>>>>     char[] foo = (cast(char*)null)[0..10];
>>>> }
>>>
>>> Great example! I am now convinced there is nothing
>>>> to worry about. Thanks everyone for the help!
>>  I'm baffled.
>>  I would have expected this to cause an error!
>>  And if really not, what in the world is
>>     (cast(char*)null)[0..10]
>>  supposed to mean, or return???
>
> Who knows what it means--it should cause an access violation at run time.

Why? I mean null is the memory address 0x0 and slicing simply assigns a  
string to the values given, eg.

//assuming
struct string {
   void* data;
   int length;
}

//we get
string a;
a.data = null;
a.length = 10;

which, while the result is a totally invalid string it doesn't actually  
read/write anything to the memory address 0x0 (null), so, no access  
violation or similar.

If anything it's an array bounds error.. but array bounds checking doesn't  
occur when creating slices from pointers (for obvious reasons) so.. unless  
a special case check was added for null, I can't see what D/DMD could do  
about it.

Regan



More information about the Digitalmars-d-learn mailing list