On Saturday, 2 August 2014 at 20:23:53 UTC, Andrei Alexandrescu wrote:
@system fun(int[] p) {
   gun(p.ptr + p.length);
}

@safe gun(int* p) {
   if (p) *p = 42;
}

This passes semantic checking but is unsafe and unsafety is in the @safe code. Well, that's fine, we might say. The problem is this works against our stance that "inspect @system code by hand, @safe code will take care of itself".

No! Calling gun like this is just the same as calling "gun(cast(int*)0xdeadbeef)". You wouldn't argue that the @safe code is at fault there either. Or when passing an array slice with an invalid .ptr to a @safe function. It's not like you would routinely pass p.ptr + p.length to _any_ function with a single pointer argument (except maybe for a setter for the end of an iterator pair or something like that).

Yes, p.ptr + p.length is merely invalid invalid to dereference, as opposed to being completely undefined behavior by itself (assuming C rules). But I don't see how this changes anything about the fact that fun() invokes a function with invalid parameters (@safe or not).

Cheers,
David

Reply via email to