s-stchop.adb (Stack_Check): Raise Storage_Error if the argument has wrapped around.

2006-02-13  Eric Botcazou  <ebotcazou@adacore.com>

	* s-stchop.adb (Stack_Check): Raise Storage_Error if the argument has
	wrapped around.

From-SVN: r111050
This commit is contained in:
Eric Botcazou 2006-02-15 10:36:13 +01:00 committed by Arnaud Charlet
parent 3a0462b3e6
commit 463af61db6

View file

@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1999-2005 Free Software Foundation, Inc. -- -- Copyright (C) 1999-2006 Free Software Foundation, Inc. --
-- -- -- --
-- GNARL is free software; you can redistribute it and/or modify it under -- -- GNARL is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- -- -- terms of the GNU General Public License as published by the Free Soft- --
@ -179,6 +179,20 @@ package body System.Stack_Checking.Operations is
Frame_Address : constant System.Address := Marker'Address; Frame_Address : constant System.Address := Marker'Address;
begin begin
-- The parameter may have wrapped around in System.Address arithmetics.
-- In that case, we have no other choices than raising the exception.
if (Stack_Grows_Down and then
Stack_Address > Frame_Address)
or else
(not Stack_Grows_Down and then
Stack_Address < Frame_Address)
then
Ada.Exceptions.Raise_Exception
(E => Storage_Error'Identity,
Message => "stack overflow detected");
end if;
-- This function first does a "cheap" check which is correct -- This function first does a "cheap" check which is correct
-- if it succeeds. In case of failure, the full check is done. -- if it succeeds. In case of failure, the full check is done.
-- Ideally the cheap check should be done in an optimized manner, -- Ideally the cheap check should be done in an optimized manner,