comp.lang.ada
 help / color / mirror / Atom feed
From: Robert A Duff <bobduff@shell01.TheWorld.com>
Subject: Re: Controlled types and exception safety
Date: 02 Dec 2005 18:51:41 -0500
Date: 2005-12-02T18:51:41-05:00	[thread overview]
Message-ID: <wccu0drrraq.fsf@shell01.TheWorld.com> (raw)
In-Reply-To: 6Qvjf.3059$Hk1.2021@newsread1.news.pas.earthlink.net

"Jeffrey R. Carter" <spam@spam.com> writes:

> Bj�rn Persson wrote:
> 
> > Can't Maciej's concerns be applied to step 6? What to do about
> > exceptions that happen while the new X is being adjusted, after the
> > old X has been finalized?
> 
> You can get Storage_Error if Adjust allocates storage. Other sorts of
> exceptions should have occurred during the adjustment of the
> intermediate object, and so corrected before the assignment to X.
> 
> Storage_Error is a strange beast; there's no guarantee that you can do
> anything about it. There may not even be enough storage available to
> execute an exception handler.

Right.  In practise, you can get away with handling Storage_Error, but
it's annoying that it is pretty-much impossible to write a handler for
Storage_Error in Ada that is guaranteed (portably) correct by the RM.
Ada is better than some languages, where a stack overflow can go
entirely undetected, and the program just starts overwriting
who-knows-what data.

But I think I've got a better way, which I would use in my own language
design.

My idea is that stack overflow is like an abort or a hardware interrupt.
An abort is asynchronous with the running code -- it can happen
anywhere, even in the middle of "X := Y".  If X:=Y can is aborted in the
middle, we say that X becomes abnormal -- perhaps its discriminants are
nonsensical, so later code can't even determine the size of X.  The
solution is to have abort-deferred regions -- regions of code where
abort can't happen.  Inside such a region, you can say X:=Y, and be sure
that X is unchanged, or Y is fully copied into it.  If somebody attempts
to abort in the middle of X:=Y, the abort will take effect at the end,
and all is well.

Same thing for hardware interrupts -- the solution is to allow
(hopefully short) regions of code where interrupts can't interrupt.

Stack overflow is asynchronous in the sense that it can happen pretty
much anywhere.  So in my fictitious language, you can have regions of
code where stack overflow can't happen.  The compiler is required to
calculate (at link time!) a static quantity that is the max stack usage
for each procedure, task, and other relevant construct.  This quantity
is an integer ranging from 0 up to the max size of the address space
(System.Memory_Size, in Ada).  Calculations use saturating arithmetic.

When you enter a no-stack-overflow region, we allocate the max size for
that region, and raise Storage_Error if that's not possible.  So it's
like an abort-deferred or interrupt-deferred region, except that the
deferral goes backward in time -- if Storage_Error _might_ be raised in
that region, we instead raise it before entering the region.

Of course, the code in a no-stack-overflow region can't do stuff that
allocates unknown amounts of stack space.  If a procedure has a local
variable of subtype String, with no compile-time-known bounds, the max
size is perhaps 2**31 bytes or so.  If a procedure is recursive, the max
size is System.Memory_Size.  If a procedure makes an indirect call (so
it _might_ be recursive), the max size is System.Memory_Size.  So you
write no-stack-overflow regions with small numbers of known-size
locals.  But that's OK -- all you want to do is log the error, clean up
some things, and return to a more-global point in the program.

If the max size for such a region is System.Memory_Size, or close to it,
the compiler should at least issue a warning, because at run time, every
execution of that thing will raise S_E.

Storage_Error also applies to "new", but that seems like an easier
problem.  The allocator can be "blamed", so heap overflow is not
asynchronous like stack overflow.  At least, for _explicit_ use of the
heap.  If the compiler is allocating activation records on the heap
or some such, then that's still an issue.

- Bob



  reply	other threads:[~2005-12-02 23:51 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-30 13:57 Controlled types and exception safety Maciej Sobczak
2005-11-30 15:06 ` Dmitry A. Kazakov
2005-11-30 16:19   ` Maciej Sobczak
2005-12-01  0:05     ` Stephen Leake
2005-12-01  9:21     ` Dmitry A. Kazakov
2005-12-01 10:46       ` Maciej Sobczak
2005-12-01 15:08         ` Dmitry A. Kazakov
2005-12-02  4:17           ` Randy Brukardt
2005-12-02  9:29             ` Maciej Sobczak
2005-12-02 18:12               ` tmoran
2005-12-02 19:15                 ` Robert A Duff
2005-12-02 21:42                   ` tmoran
2005-12-06  9:00                     ` Maciej Sobczak
2005-12-06  9:50                       ` Dmitry A. Kazakov
2005-12-06 18:34                         ` Jeffrey R. Carter
2005-12-06 19:34                           ` Randy Brukardt
2005-12-06 21:20                             ` Dmitry A. Kazakov
2005-12-07  1:57                             ` Jeffrey R. Carter
2005-12-08  0:50                               ` Randy Brukardt
2005-12-08 19:37                                 ` Jeffrey R. Carter
2005-12-09  2:36                                   ` Randy Brukardt
2005-12-09  6:33                                     ` Jeffrey R. Carter
2005-12-09 20:35                                       ` Randy Brukardt
2005-12-10  7:53                                         ` Jeffrey R. Carter
2005-12-06 20:43                           ` Dmitry A. Kazakov
2005-12-07  2:00                             ` Jeffrey R. Carter
2005-12-07 10:01                               ` Dmitry A. Kazakov
2005-12-02 23:21             ` Robert A Duff
2005-11-30 17:46 ` Jean-Pierre Rosen
2005-11-30 21:02 ` Jeffrey R. Carter
2005-11-30 22:06   ` Björn Persson
2005-11-30 23:52     ` Randy Brukardt
2005-12-01  5:26     ` Jeffrey R. Carter
2005-12-02 23:51       ` Robert A Duff [this message]
2005-12-06 11:41   ` Peter C. Chapin
2005-12-06 12:50     ` Jean-Pierre Rosen
2005-12-06 13:06     ` Dmitry A. Kazakov
replies disabled

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