[D-runtime] win32 regression in exception handling

Don Clugston dclugston at googlemail.com
Wed Jan 26 01:11:10 PST 2011


On 26 January 2011 09:33, Jonathan M Davis <jmdavisProg at gmx.com> wrote:
> On Wednesday 26 January 2011 00:25:34 Brad Roberts wrote:
>> On 1/24/2011 8:00 PM, Brad Roberts wrote:
>> > Now that the dust of the svn -> git migration has settled some, there's a
>> > failure that's stuck with us.  Since this druntime change, the win32 dmd
>> > test34.d test has failed:
>> >
>> > https://github.com/D-Programming-Language/druntime/commit/559df80b3d9c512
>> > 72c5804de8df27af75099b977
>> >
>> > http://d.puremagic.com/test-results/test_data.ghtml?dataid=43441
>> >
>> >   Before test 3:
>> >   object.Error at src\rt\deh.d(631): Access Violation
>> >
>> > I did a test build at the previous commit and the test passes.  So that's
>> > definitely the one that introduces the problem.  It might well be just
>> > exposing a dormant problem, but either way, it stopped working at that
>> > point.
>>
>> Ok.. I finally took some time to dive into this one.  It's failing on a
>> catch (DerivedFromError) situation.
>>
>> From test34.d:
>>
>> class B58
>> {    long x;
>>      void set(long i) { writeln("B58::set(long)"); x = i; }
>>      void set(int i)  { writeln("B58::set(int)"); x = i; }
>>      long squareIt()  { writeln("B58::squareit()"); return x * x; }
>> }
>> class D58 : B58
>> {
>>      long square;
>>      void set(long i) { writeln("D58::set(long)"); B58.set(i); square = x *
>> x; } long squareIt()  { writeln("D58::squareit()"); return square; } }
>>
>> long foo58(B58 b)
>> {   int i;
>>     try
>>     {
>>         b.set(3);
>>     }
>>     catch (HiddenFuncError o)
>>     {
>>         i = 1;
>>     }
>>     assert(i == 1);
>>     return b.squareIt();
>> }
>>
>> void test58()
>> {
>>     writeln(foo58(new D58));
>> }
>>
>> Catching Error derived classes is illegal-ish now, right?  I haven't
>> narrowed it down to exactly where the segv is coming from (the line number
>> above is the part of the eh mechanism that's constructing the error object
>> in the SEH receiving code, not the point of the segv.. unless that line of
>> code is segving somehow.
>>
>> Don, do you have the time to dig a little since you've been all over that
>> part of the code recently?
>
> As I understand it, catching Errors is perfectly legal, but because none of the
> proper cleanup is going to have been done between the point that Error was
> thrown from and the point that it was caught it, the state of things might be a
> bit messed up. The unit testing functions that I wrote which are currently under
> review catch Errors, and they'd be somewhat crippled if they couldn't.


>
> Catching Errors is not generally a good idea, but as far as I understand it,
> it's supposed to be legal.

Yes, that's correct, it's legal to catch errors.
There is an obvious disastrous problem with that commit: the inclusion
of __FILE__ and __LINE__ in the constructors for Error and Throwable
is completely wrong. They should not be in there. That assumes that
the exceptions are thrown via a throw statement, which is not correct,
and will cause serious problems. Dunno if that's the only problem,
though.
Sorry, don't have any more time right now.


More information about the D-runtime mailing list