From 78c8766abade0b81097e64433ac8c4c35d9e6314 Mon Sep 17 00:00:00 2001 From: Xi Wang Date: Fri, 16 Nov 2012 03:13:02 -0500 Subject: [PATCH] bigdecimal.c: avoid undefined overflow checking Compilers may optimize away the overflow/underflow checks since signed integer overflow is undefined behavior in C. This patch uses unsigned multiplications instead. --- ext/bigdecimal/bigdecimal.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index fa32c99..9de9158 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -3677,15 +3677,16 @@ AddExponent(Real *a, SIGNED_VALUE n) SIGNED_VALUE e = a->exponent; SIGNED_VALUE m = e+n; SIGNED_VALUE eb, mb; + /* Use unsigned VALUE to avoid undefined behavior */ if(e>0) { if(n>0) { - mb = m*(SIGNED_VALUE)BASE_FIG; - eb = e*(SIGNED_VALUE)BASE_FIG; + mb = m*(VALUE)BASE_FIG; + eb = e*(VALUE)BASE_FIG; if(mbeb) goto underflow; } a->exponent = m; -- 1.7.10.4