From: Duncan Sands <baldrick@free.fr>
To: Randy Brukardt <randy@rrsoftware.com>
Cc: comp.lang.ada@ada-france.org
Subject: Re: Return_By_Reference or Return_By_Copy (GNAT bug?)
Date: Tue, 08 Mar 2005 17:12:57 +0100
Date: 2005-03-08T17:12:57+01:00 [thread overview]
Message-ID: <mailman.1.1110298394.23655.comp.lang.ada@ada-france.org> (raw)
In-Reply-To: <FKadnUS6t-UscH_cRVn-vg@megapath.net>
On Mon, 2005-01-10 at 15:05 -0600, Randy Brukardt wrote:
> "Duncan Sands" <baldrick@free.fr> wrote in message
> news:mailman.38.1105189579.527.comp.lang.ada@ada-france.org...
> > Hi Randy,
> >
> > > > I was playing around with return by reference to see if it is possible
> to
> > > > get unserialized access to a protected variable using the Rosen trick
> (it
> > > is,
> > > > see example below, especially the protected object P in package C).
> Will
> > > this
> > > > be illegal in Ada 2005?
> > >
> > > Yes, it will.
> >
> > it seems to be legal to have a protected procedure pass out an access to a
> > protected variable, allowing that variable to be accessed without
> serialisation.
> > I somehow expected this to be illegal... Is there any legitimate use for
> it?
>
> I would have expected that accessibility checks would have made that
> illegal. Or that it would have been legal in Ada 95. But I haven't been able
> to convince myself that either is the case. I'm pretty sure that no one has
> thought about this as a problem.
>
> Since we're still fixing problems in the standard, there is still time to
> consider this issue. Therefore, I'd suggest writing an example using Ada
> 2005 anonymous access functions and sending it to Ada-Comment@ada-auth.org
> along with your question. That way, it will get some airing in front of the
> ARG.
Hi Randy, in fact there is no need for anonymous access types. Consider
the following program. The protected procedure PT.G passes a pointer to
one of its protected variables to an outside procedure DDD, which merrily
modifies the variable with no synchronization at all. With the latest
GNAT compiler I see:
$ ./ddd
0
1
All the best,
Duncan.
-- chop here --
package CCC is
type IA is access all Integer;
protected PT is
procedure G (P : out IA);
function H return Integer;
private
I : aliased Integer;
end;
end CCC;
package body CCC is
protected body PT is
procedure G (P : out IA) is
begin
P := I'Access;
end;
function H return Integer is
begin
return I;
end;
end;
end CCC;
with Ada.Text_IO;
use Ada.Text_IO;
with CCC;
use CCC;
procedure DDD is
X : IA;
begin
Put_Line (Integer'Image (PT.H));
PT.G (X);
X.all := 1;
Put_Line (Integer'Image (PT.H));
end DDD;
prev parent reply other threads:[~2005-03-08 16:12 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-12-31 11:07 Return_By_Reference or Return_By_Copy (GNAT bug?) Duncan Sands
2004-12-31 21:32 ` Randy Brukardt
2005-01-01 22:00 ` Duncan Sands
2005-01-03 23:11 ` Randy Brukardt
2005-01-04 4:20 ` Larry Kilgallen
2005-01-04 23:27 ` Randy Brukardt
2005-01-08 13:06 ` Duncan Sands
2005-01-10 21:05 ` Randy Brukardt
2005-03-08 16:12 ` Duncan Sands [this message]
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox