comp.lang.ada
 help / color / mirror / Atom feed
From: M E Leypold <development-2006-8ecbb5cc8aREMOVETHIS@ANDTHATm-e-leypold.de>
Subject: Re: A smaller self contained test case. Was: Compiler Bug or what I'm doing wrong?
Date: 24 Jun 2006 14:27:16 +0200
Date: 2006-06-24T14:27:16+02:00	[thread overview]
Message-ID: <7sr71erb6j.fsf@hod.lan.m-e-leypold.de> (raw)
In-Reply-To: 1cfjjgsg6wwv4.44snml2yzt42$.dlg@40tude.net


"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:

> On 23 Jun 2006 11:55:23 +0200, M E Leypold wrote:
> 
> > I'm attaching a smaller (and now self contained test case!) for the
> > SIGSEGV whil reading/writing varaint records which I wrote about
> > earlier.
> > 
> > Some data:
> > 
> >  1. Gnat 3.15p on Debian Sarge.
> >  2. Running the attached program wil result in a SIGSEGV in a finalizer.
> > 
> > I'm also attaching a short backtrace.
> 
> Well, it looks like a bug to me.

Thanks for the confirmation :-).

> 
> ARM 13.13.2 (9) reads:
> 
>    "If T is a discriminated type, discriminants are included only if they
> have defaults."

I understood it like this: If the discrimant has defaults the type is
definite (translate that as "has fixed memory allocation
requirements"). Then 'Read is expected to handle the type. Else (no
default discriminant) the type is indefinite ("no fixed memory
allocation requirement") and 'Input would be the appropriate function
to read from a Stream, but it would essentially read the discriminats,
allocate memory and then invoke 'Read. 

If my understanding is wrong here, please correct me anyone.
 
> which assumes that if they have, then 'Write/'Read should handle them
> properly. When the discriminant is set to false before making 'Read, the
> program works as expected.

> 
> The problem is essentially:

Yes ...

> 
> type Foo (C : Boolean := True) is ...;
> 
> X : Foo (False);
> ...
> Foo'Write (S, X);
> 
> 
> Y : Foo (True);
> ...
> Foo'Read (S, Y); -- Boom


But not quite: A problem only turns up if there are finalizers in
variant parts. The compiler generated 'read procedure must of course
run the finalizer correctly when overwriting the record fields.

I hypothesized that in 

    type Foo (C : Boolean := True) is record

         case C is 
              when True  => .... -- [1]
              when False => .... -- [2]
         end case;

    end record;

actually the finalizers in the wrong variant part are run if the
default disriminant is different from the discriminant read from the
stream. So, if the discriminant read from the strem is False, it would
be actually the finalizers in [2] that are run.

Interesting enough there are a huge number of cases where this is of
no consequence whatsoever, which might account for the fact that this
bug is in 3.15p (which after all has gone through some years of
development and the bug is elementary, if tricky):

 - If there are no controlled types in parts [1] or [2].

 - If the position of the representations of the controlled data fields in [1]
   and [2] coincide and they are of the same type.

 - If the controlled type is not freeing resources.

 - If the controlled type is in [1]: This results in a slow ressource
   leak which probably stays undetected for a long time.

The only case where things go really bad, and become conspicous to the
compiler user, is when the corntrolled type is in [2] and frees
ressources which can't be freed doubly or where there can be invalid
resource handles (like null pointers to malloc()).

The hypothesis that the wrong finalizers are being run could be tested
of course (by using a custom controlled type), but I haven't done it
yet (fixing my application or getting a new Gnat as obviously
priority).

Regards -- Markus






  reply	other threads:[~2006-06-24 12:27 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-06-20 16:56 Compiler Bug or what I'm doing wrong? M E Leypold
2006-06-21  7:44 ` Ludovic Brenta
2006-06-21 12:29   ` M E Leypold
2006-06-21 12:46     ` Alex R. Mosteo
2006-06-21 13:23       ` M E Leypold
2006-06-22 19:10         ` Simon Wright
2006-06-23  8:24         ` Ludovic Brenta
2006-06-23 13:14         ` Alex R. Mosteo
2006-06-23 13:24           ` Alex R. Mosteo
2006-06-24 20:33             ` Simon Wright
2006-06-24 20:56               ` M E Leypold
2006-06-26  7:32                 ` Ludovic Brenta
2006-06-26 11:16                   ` M E Leypold
2006-06-26 12:13                     ` [Ada in Debian] GtkAda and GNAT versions Ludovic Brenta
2006-06-26 12:25                       ` M E Leypold
2006-06-27 20:55                   ` Compiler Bug or what I'm doing wrong? Simon Wright
2006-06-27 22:26                     ` Ludovic Brenta
2006-06-22  2:07       ` James Dennett
2006-06-22  6:37         ` Duncan Sands
2006-06-22 16:53           ` M E Leypold
2006-06-22 19:01             ` Pascal Obry
2006-06-23  8:37               ` M E Leypold
2006-06-22 19:05             ` Dmitry A. Kazakov
2006-06-23  4:47               ` Jeffrey R. Carter
2006-06-23 12:26               ` Stephen Leake
2006-06-23 13:11                 ` Dmitry A. Kazakov
2006-06-23 13:15                 ` Alex R. Mosteo
2006-06-23  9:55 ` A smaller self contained test case. Was: " M E Leypold
2006-06-23 10:03   ` M E Leypold
2006-06-23 11:04   ` And a Workaround: Was: A smaller test case / Compiler Bug M E Leypold
2006-06-23 11:12     ` Possible memory leaks when reading/writing variant records M E Leypold
2006-06-24 11:46   ` A smaller self contained test case. Was: Compiler Bug or what I'm doing wrong? Dmitry A. Kazakov
2006-06-24 12:27     ` M E Leypold [this message]
2006-06-24 12:52       ` Dmitry A. Kazakov
2006-06-24 13:53         ` M E Leypold
2006-06-24 19:58           ` Dmitry A. Kazakov
2006-06-24 20:22             ` M E Leypold
2006-06-25  7:59               ` Dmitry A. Kazakov
2006-06-25 10:51                 ` M E Leypold
2006-06-26  6:22                   ` Martin Dowie
2006-06-24 21:21             ` M E Leypold
2006-06-25 21:36   ` M E Leypold
2006-06-26 21:53   ` Possibly fixed in gcc 4.1.1, but bug box -- Was: Re: A smaller self contained test case M E Leypold
2006-06-27 18:24     ` Alex R. Mosteo
2006-06-27 22:58       ` M E Leypold
2006-06-28 10:32         ` Alex R. Mosteo
2006-07-03  1:38         ` Steve Whalen
2006-07-03 10:36           ` M E Leypold
2006-06-28  8:41       ` Ludovic Brenta
2006-06-28  8:51         ` Georg Bauhaus
2006-06-28 10:43         ` Alex R. Mosteo
2006-06-23 10:00 ` Compiler Bug or what I'm doing wrong? M E Leypold
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox