Corey, Rick,
The -gnato option forces overflow checking. We set this in the
student scripts we use in courses here.
Mike Feldman
>
> 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;
>
|