[Oberon] Runtime Overflow Checks (was: Negative integer literals in Oberon)
Jörg
joerg.straube at iaeth.ch
Sun May 3 12:28:01 CEST 2020
Chris
Such a hidden feature does exist in the Oberon-07 compiler as well:
i := 47000;
i := i * 47000;
IF SYSTEM.COND(0) THEN Out.String("overflow"); Out.Ln END;
The parameter is the condition you like to check.
The case above could be catched with this as well
IF i < 0 THEN Out.String("overflow"); Out.Ln END;
br
Jörg
Am 03.05.20, 02:22 schrieb "Oberon im Auftrag von Chris Burrows" <oberon-bounces at lists.inf.ethz.ch im Auftrag von chris at cfbsoftware.com>:
> -----Original Message-----
> From: Oberon [mailto:oberon-bounces at lists.inf.ethz.ch] On Behalf Of
> dave at brownsmeet.com
> Sent: Saturday, 2 May 2020 11:49 PM
> To: ETH Oberon and related systems
> Subject: Re: [Oberon] Negative integer literals in Oberon
>
> Personally I am surprised there is not more support in compilers (of all
> languages) for generating run time integer overflow checking code.
>
Inevitably run time integer overflow checking code leads to an impact on performance. Assuming that such an impact is considered to be acceptable, the next question is: What should a runtime system do when it detects an integer overflow? Some might say it should cause an application to come to an abrupt halt in mid-flight. That is not always desirable behaviour.
To be palatable, systems that do generate runtime integer overflow checks also need to allow the programmer to disable them. If the checks can be turned on and off at will it becomes more difficult to verify that the application is correct. Hence, the scope of such switches must be as local as possible e.g. a single statement.
An alternative solution is to give the programmer a means to detect when overflow has occurred rather than generating runtime overflow checks by default. The programmer would have a much better idea than the compiler implementer of when they were required and the best course of action to take when they were detcted. One example I have seen of this was in Wirth's Oberon-07 ARM compiler. This had an additional function SYSTEM.OVFL. My understanding is that this returns TRUE if the previous assignment generated an overflow condition that was detectable by the hardware. E.g. you could write something like:
(* untested! *)
j := 1;
FOR i := 1 TO 128 DO
j := j * 2;
IF SYSTEM.OVFL(j) THEN Out.String("Size of INTEGER in bits = "); Out.Int(i, 0) END
END;
Regards,
Chris Burrows
CFB Software
https://www.astrobe.com
--
Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
https://lists.inf.ethz.ch/mailman/listinfo/oberon
More information about the Oberon
mailing list