Read the GNAT documentation. If I remember correctly, it does not,
by default, check for integer overflow. You have to set a compiler option
to do this.
GNAT is not fully conformant to all the semantics required for validation
in it's default mode, and rightly so, I believe. You have to give it the
right options to make it fully conform.
-Corey
Rick Duley wrote:
> Hi teamers,
>
> I was working on a demonstration exercise for students the other day and
> gave myself one heck of a surprise.
> The idea was that I could increment an integer variable past Integer'Last
> and trap the ensuing uproar, doing something useful with it without
> crashing
> the program. Well, ...that was the idea :(
>
> I am using GNAT 3.13p -- is this a problem with the compiler or have I
> misunderstood the purpose of CONSTRAINT_ERROR all these years? Do I
> have to
> do a manual check for run-time errors like this or am I doomed to have my
> jet plane turn upside down when the variable goes from positive to
> negative?
> ;)
>
> Keep the faith
> ---------------------------------------------------------
>
> Please: if you have not already done so, alter your addressbook
> settings for
> me to
> [log in to unmask]
> ---------------------------------------------------------
> Rick Duley
> Perth, Western Australia
> tel: +61 040 910 6049 /-_|\
> / \
> perth *_.-._/
> "Never be a pioneer. v
> It's the early Christian
> that gets the fattest Lion."
> Saki (H. H. Munro (1870 - 1916))
>
>
>
>
>
> _________________________________________________________________
> Get your FREE download of MSN Explorer at
> http://explorer.msn.com/intl.asp
> -- ada programming problem from
> -- rick duley
> -- edith cowan university
> -- perth, western australia
> -- [log in to unmask]
> --
> -- explanations, suggestions, solutions please
> --
> with Ada.Text_Io; use Ada.Text_Io;
> with Ada.Exceptions; use Ada.Exceptions;
> procedure Fall_Off_The_End is
> --
> -- in the PC implementation for which this program was
> -- written and compiled with GNAT 3.13p the maximum
> -- integer value (Integer'Last) is 2,147,486,647
> -- this program starts with something close and increments
> -- until the value is exceeded
> -- the idea is to show that CONSTRAINT_ERROR is raised and
> -- can be protected against without intefering with the
> -- run of the program
> --
> -- oops!
> --
> Start : constant Integer := 2_147_483_600;
> Log_File : File_Type;
> begin -- Fall_Off_The_End
> Create
> (File => Log_File,
> Mode => Out_File,
> Name => "Fall_Off_The_End.txt");
>
> Count_Loop:
> for Count in 1 .. 100 loop
> Protect_Block:
> declare
>
> -- this is where the fun should begin
> Current : Integer := Start + Count;
> -- once the value of Count exceeds 47 this
> -- assignment should (IMHO) raise
> -- CONSTRAINT_ERROR and drive the point of
> -- control into the exception handler
>
> begin -- Protect_Block
> Put_Line(Item => Integer'Image(Current));
> Put_Line(File => Log_File,
> Item => Integer'Image(Current));
> exception
> when Error: others =>
> -- write to log file
> Put_Line(File => Log_File,
> Item => Exception_Name(Error));
> Put_Line(File => Log_File,
> Item => Exception_Message(Error));
> Put_Line(File => Log_File,
> Item => "Resetting Current to"
> & Integer'Image(Integer'Last));
>
> -- reset operating value
> Current := Integer'Last;
>
> -- confirm in log file
> Put_Line(File => Log_File,
> Item => Integer'Image(Current));
>
> -- write to screen
> Put_Line(Item => Exception_Name(Error));
> Put_Line(Item => Exception_Message(Error));
> Put_Line(Item => "Current reset to"
> & Integer'Image(Integer'Last));
> Put_Line(Item => Integer'Image(Current));
> end Protect_Block;
> end loop Count_Loop;
>
> Ada.Text_Io.Close
> (File => Log_File);
> end Fall_Off_The_End;
|