OSDN Git Service

2006-02-13 Eric Botcazou <ebotcazou@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Feb 2006 09:36:13 +0000 (09:36 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Feb 2006 09:36:13 +0000 (09:36 +0000)
* s-stchop.adb (Stack_Check): Raise Storage_Error if the argument has
wrapped around.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111050 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/s-stchop.adb

index 2f9c809..f1478f3 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                  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 --
 -- 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;
 
    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
       --  if it succeeds. In case of failure, the full check is done.
       --  Ideally the cheap check should be done in an optimized manner,