On 03/02/2018 03:39 PM, Steven Schveighoffer wrote:
On 3/1/18 5:27 PM, ag0aep6g wrote:
[...]
No, I'm looking at the source code.

At the very basic level, you have this:

assert(foo == 0);

Or whatever other condition you have. What this does is gives the compiler leeway to ASSUME foo is 0 at this point. It can make any number of optimizations assuming this. If foo is NOT equal to 0 at this point, then it is a program error, and the assumptions may cause bad things to happen.

When you compile in normal mode, this assert causes an Error to be thrown, before your code can do any damage.

When you compile without asserts, this causes undefined behavior.

Now you're looking beyond the source code. There's no "normal mode" or "without asserts mode" in D source code. What you've got in the D code is @safe and @system.

Looking at it your way makes sense when the question is how the actual generated executable will behave. But I think it's also valuable to look at the language in isolation, without compiler settings.

I'd put it this way:

1) @system code may have UB. For example, out-of-bounds accesses have UB in @system code.

2) A compiler may give guarantees on what it does with specific instances of UB. For example, DMD guarantees that it throws an Error on out-of-bounds accesses, unless you compile with -release. This makes it effectively implementation defined behavior. You can rely on this. But when considering the source code in isolation, it still has UB.

3) @safe code cannot have UB. This is a strong guarantee. This cannot be affected by compiler switches without violating the spec.

[...]
I extend this same treatment and logic to all checks: contracts, bounds checks, overlapping slice assign checks, etc. To me, they aren't any different than asserts. They aren't any different if they are in @safe code or @system code.

I don't agree with the @safe/@system part. @safe code must not exhibit UB. That's the point of the attribute.

Checks that would fail may cause UB in @system code, but they can't be allowed to cause UB in @safe code. Because nothing can be allowed to cause UB in @safe code.

[...]
I agree, I think we should remove the option to disable bounds checks on @safe code, in any way. It's too dangerous. If you want performance that comes without bounds checks, use a trusted escape, or write system code.

I'm not going to argue against that, obviously.

Reply via email to