On Wednesday, 31 May 2017 at 23:53:11 UTC, Steven Schveighoffer wrote:
On 5/31/17 7:13 PM, Moritz Maxeiner wrote:
On Wednesday, 31 May 2017 at 22:47:38 UTC, Steven Schveighoffer wrote:

Again, there has not been memory corruption.

Again, the runtime *cannot* know that and hence you *cannot* claim that. It sees an index out of bounds and it *cannot* reason about whether a memory corruption has already occurred or not, which means it *must
assume* the worst case (it must *assume* there was).

Yes, it cannot know at any point whether or not a memory corruption has occurred. However, it has a lever to pull to say "your program cannot continue, and you have no choice." It chooses to pull this lever on any attempt of out of bounds access of an array, regardless of the reason why that is happening.

Because assuming the worst is a sane default.

The chances that a memory corruption is the cause is so low, and it doesn't matter even if it is. The program may already have messed up everything by that point.

True, it might have already corrupted other things; but that is no argument for allowing it to continue to potentially corrupt even more.

In fact, the current behavior of printing the Error message and doing an orderly shutdown is pretty risky anyway if we think this is a memory corruption.

AFAIK the orderly shutdown is not guaranteed to be done in release mode and I would welcome for thrown errors in release mode to simply kill the process immediately.



There is a  confusion rampant in this thread that preventing
*attempted* memory corruption must mean there *is* memory corruption.

No, please no. Nobody has written that in the entire thread even once!

"you have to assume that the index *being* out of bounds is itself the *result* of *already occurred* data corruption;"

Yes, precisely.
I state: "you have to assume that the index *being* out of bounds is itself the *result* of *already occurred* data corruption;" You state: "that preventing *attempted* memory corruption must mean there *is* memory corruption"

You state that I claim the memory corruption must definitely have occurred, while in contrast I state that one has to *assume* that is has occurred. *Not* the same.


It's not the runtime's job to determine that the cause of an out-of-bounds access could be memory corruption.

That was the job of whoever wrote the runtime, yes.

It's job is to  prevent the current attempt.

That is one of its jobs. The other is to terminate when it detects potential memory corruptions the programmer has not ensured are not.

The problem I have is that throwing an Error itself corrupts the program, and makes it unusable.

Because the programmer has not done the steps to ensure the runtime that memory has not been corrupted, that is the only sane choice I see.

It's easy to prove as well that throwing an Exception instead of an Error is perfectly safe. My array wrapper is perfectly safe and does not throw an Error on bad indexing.

And anyone using wrapper implicitly promises that a wrong index cannot be the result of memory corruption, which can definitely be a sane choice for a lot of use cases, but not as the default for the basic building block in the language.

Reply via email to