On 8/2/14, 11:55 AM, Walter Bright wrote:
On 8/2/2014 8:08 AM, Andrei Alexandrescu wrote:
On 8/2/14, 5:44 AM, Artur Skawina via Digitalmars-d wrote:
   auto fx(ubyte* p, size_t len) @safe {
       assert_(len>0);
       if (len>=1)
          return p[0];
       return -1;
    }

As an aside I think it's a bug that this function passes @safe. It
should not be
able to safely dereference the pointer because it may be e.g. just
past the end
of the array. Has this been submitted as a bug? -- Andrei


There's more than one way to think about it. We could disable all
pointer dereferences, but another way is to fall back on the presumption
that arguments to @safe functions must themselves be valid.

I.e. is this @safe:

    &array[length]

? How could a pointer past the end be created in @safe code?

The way I see it, if we allow pointer dereference in @safe code, we must make sure that @safe code can never produce a past-the-end pointer.

Assume we choose that, there's still murky ground:

@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". The problem is that pointers just past the end have this weird property "the pointer is okay but not for dereferencing".


Andrei

Reply via email to