r275790 - in /trunk/gcc/ada: ChangeLog libgnat/...

pmderodat@gcc.gnu.org pmderodat@gcc.gnu.org
Tue Sep 17 08:02:00 GMT 2019


Author: pmderodat
Date: Tue Sep 17 08:02:25 2019
New Revision: 275790

URL: https://gcc.gnu.org/viewcvs?rev=275790&root=gcc&view=rev
Log:
[Ada] Fix possible suppressed overflows in arithmetic run-time

Function Double_Divide computes the division of its parameters
(X / (Y*Z)) in a way that avoids overflows on signed integers, except in
two specific cases, when X = -2**63, abs(Y) = abs(Z) = 1 (leading to an
overflow in -To_Int(Qu)) and when X = -2**63 and Y*Z is large enough
that Qu=0 and so the remainder Ru=2**63 (leading to an overflow in
-To_Int(Ru)), for example with Y = Z = 2**32-1.

This fix avoids the overflow by applying "-" on the unsigned value
before the conversion to signed integer.

The issue cannot manifest as an overflow check failure in our runtime,
as overflow checks are suppressed by using pragma Suppress at the start
of the file. Assuming a machine implements wraparound semantics here,
the result was correct even with the suppressed overflow.

As a result, there can be no test showing the difference.

2019-09-17  Yannick Moy  <moy@adacore.com>

gcc/ada/

	* libgnat/s-arit64.adb (Double_Divide): Fix two possible
	overflows.

Modified:
    trunk/gcc/ada/ChangeLog
    trunk/gcc/ada/libgnat/s-arit64.adb



More information about the Gcc-cvs mailing list