comp.lang.ada
 help / color / mirror / Atom feed
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;





      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