On 04/04/2013 08:47 AM, Jesse Phillips wrote:

> On Wednesday, 3 April 2013 at 16:19:25 UTC, Ali Çehreli wrote:
>> >      auto myFile = "some.tmp";
>> >      scope(exit) remove(myFile);
>> >
>> >      // setup code here
>> >      manipulateFileRange(range);
>>
>> We are in agreement that it would be impossible to prove one way or
>> the other whether removing the file would be the right thing to do or
>> whether it will succeed.
>
> All you need is one example where it would remove the wrong file,

$ dmd deneme.d -ofdeneme -I~/deneme/d -O -inline -m32
$ ./deneme

import std.stdio;
import std.string;
import std.array;

void main()
{
    auto myFile = "some.tmp";
    scope(exit) writeln(format("removing %s", myFile));

    writeln("myFile.ptr ", myFile.ptr);

    void manipulateElement(E)(ref E e)
    {
        size_t local;
        // Playing with pointers (BUG HERE)
        *(&local + 10) = 4;
        *(&local - 1) = 100;
        writeln(&local - 1);
        writeln("myFile ", &myFile);
        writeln("e ", e.ptr);
    }

    void manipulateFileRange(R)(R range)
    {
        for (size_t i = 0; i != range.length; ++i) {
            writeln("&i ", &i);
            writeln("i ", i);
            manipulateElement(range[i]);
        }
    }

    manipulateFileRange([ myFile ]);
}

Note that RangeError below is caused by a bug in the program. Once that happens, we cannot say anything about the state of the program. It may be 99% correct but it is still in an invalid state.

Here is the output of the program (arrow and comment are added manually by me):

myFile.ptr 806C0C4
&i FFFCE5DC
i 0
FFFCE5DC
myFile FFFCE608
e 806C0C4
&i FFFCE5DC
i 101
removing some  <-- WRONG FILE! (not "some.tmp")
core.exception.RangeError@deneme(125887): Range violation

> I just
> requested that it have higher accuracy than Exception since what you're
> claiming as invalid state is the same invalid state exceptions check for
> (I didn't expect this).

Unfortunately, exception is too general a term and unfortunately both Exception and Error use the same mechanism in D.

A thrown Exception does *not* indicate invalid program state; Error does. A thrown Exception means that some task could not be accomplished.

Error is different: It means that an assertion failed. An assert failure means that the fundamental truths that the programmer has built the program on has been shattered. As simple as that. The runtime cannot assess whether the program is 1% or 100% correct. The only sensible thing to do is to stop executing so that no more harm is done. Again, a failed assert means that the program has gone out of line. It did something wrong. It is in an invalid state.

Ali

Reply via email to