[Ada] Fix possible suppressed overflows in arithmetic run-time
authorYannick Moy <moy@adacore.com>
Tue, 17 Sep 2019 08:02:25 +0000 (08:02 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 17 Sep 2019 08:02:25 +0000 (08:02 +0000)
commit7197e2db28f10dec509967bb1cbd2d74cb03ee7e
tree69738973e7cc42feb84900855f8486825c845263
parent64989f18c04c7444ecb67da9a6ccecbe40bb1c12
[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.

From-SVN: r275790
gcc/ada/ChangeLog
gcc/ada/libgnat/s-arit64.adb