From 295aeb0ed8b090528c66632490ca30c6e4e15764 Mon Sep 17 00:00:00 2001 From: Dianne Skoll Date: Mon, 30 Aug 2021 12:31:43 -0400 Subject: [PATCH] Prevent floating-point exception if we evaluate $IntMin * (-1) --- src/expr.c | 5 +++++ tests/test.cmp | 12 +++++++++++- tests/test.rem | 2 ++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/expr.c b/src/expr.c index 0600bc30..766eccc1 100644 --- a/src/expr.c +++ b/src/expr.c @@ -940,6 +940,11 @@ static int Multiply(void) } if (v1.type == INT_TYPE && v2.type == INT_TYPE) { + /* Prevent floating-point exception */ + if ((v2.v.val == -1 && v1.v.val == INT_MIN) || + (v1.v.val == -1 && v2.v.val == INT_MIN)) { + return E_2HIGH; + } int old = v1.v.val; v1.v.val *= v2.v.val; if (v2.v.val != 0) { diff --git a/tests/test.cmp b/tests/test.cmp index 15643f0d..41a5f502 100644 --- a/tests/test.cmp +++ b/tests/test.cmp @@ -3117,10 +3117,20 @@ $IntMin => -2147483648 - 1 => -1 -2147483648 / -1 => Number too high ../tests/test.rem(553): `/': Number too high +set a $IntMin * (-1) +$IntMin => -2147483648 +- 1 => -1 +-2147483648 * -1 => Number too high +../tests/test.rem(554): `*': Number too high +set a (-1) * $IntMin +- 1 => -1 +$IntMin => -2147483648 +-1 * -2147483648 => Number too high +../tests/test.rem(555): `*': Number too high set a abs($IntMin) $IntMin => -2147483648 abs(-2147483648) => Number too high -../tests/test.rem(554): Number too high +../tests/test.rem(556): Number too high # Don't want Remind to queue reminders EXIT diff --git a/tests/test.rem b/tests/test.rem index 7378a8be..eb475640 100644 --- a/tests/test.rem +++ b/tests/test.rem @@ -551,6 +551,8 @@ set a $IntMin * 2 set a $IntMin * $IntMin set a $IntMin * $IntMax set a $IntMin / (-1) +set a $IntMin * (-1) +set a (-1) * $IntMin set a abs($IntMin) # Don't want Remind to queue reminders