On Thu, 10 Apr 2014 18:54:57 -0400, Martin Krejcirik <[email protected]> wrote:

On 10.4.2014 19:12, Steven Schveighoffer wrote:
void foo(T)(T[] x) @safe
{
   x[5] = 3;
}

Is this common practice ? I'd wouldn't call it a safe design.


No, this isn't common practice. It's a demonstration of how @safe code can become un-@safe when compiled independent of the original author. In reality, nobody should rely on a bounds check to catch out of bounds conditions (I think it's an Error anyway -- a non-recoverable situation). But memory bugs in safe code should be caught, at compile time if possible, at runtime if not.

There
should be a length check or version check:

version(D_NoBoundsChecks) static assert(0, "bounds checking required");

But I get your point, I have always thought of bounds checking like an
optional safety net, you think of it like a required feature.

It is a safety net, but not optional for @safe code. The promise of @safe is that you CANNOT have a memory corruption error. To break the promise without the knowledge of the code is an incorrect plan, IMO. When you write @safe, it means "this code is memory safe, even if it has bugs."

Perhaps Andrei and Walter feel differently. I don't know.

-Steve

Reply via email to