Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/compat/gen detect overflow in oldexp + newexp



details:   https://anonhg.NetBSD.org/src/rev/abdf973067b7
branches:  trunk
changeset: 347470:abdf973067b7
user:      christos <christos%NetBSD.org@localhost>
date:      Sat Aug 27 09:11:56 2016 +0000

description:
detect overflow in oldexp + newexp

diffstat:

 lib/libc/compat/gen/compat_ldexp_ieee754.c |  27 +++++++++++++++------------
 1 files changed, 15 insertions(+), 12 deletions(-)

diffs (63 lines):

diff -r 8067bbe7215a -r abdf973067b7 lib/libc/compat/gen/compat_ldexp_ieee754.c
--- a/lib/libc/compat/gen/compat_ldexp_ieee754.c        Sat Aug 27 08:57:21 2016 +0000
+++ b/lib/libc/compat/gen/compat_ldexp_ieee754.c        Sat Aug 27 09:11:56 2016 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_ldexp_ieee754.c,v 1.5 2010/04/23 19:04:54 drochner Exp $ */
+/* $NetBSD: compat_ldexp_ieee754.c,v 1.6 2016/08/27 09:11:56 christos Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: compat_ldexp_ieee754.c,v 1.5 2010/04/23 19:04:54 drochner Exp $");
+__RCSID("$NetBSD: compat_ldexp_ieee754.c,v 1.6 2016/08/27 09:11:56 christos Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
@@ -40,6 +40,7 @@
 
 double ldexp(double, int);
 
+#include <stdio.h>
 /*
  * Multiply the given value by 2^expon.
  */
@@ -99,8 +100,19 @@
         * Calculate the new exponent and check for underflow and overflow.
         */
        newexp = oldexp + expon;
+       printf("ee %#x oldexp %#x\n", oldexp, expon);
 
-       if (newexp <= 0) {
+       if (newexp >= DBL_EXP_INFNAN ||
+           (oldexp >= 0 && expon >= DBL_EXP_INFNAN)) {
+               /*
+                * The result overflowed; return +/-Inf.
+                */
+               u.dblu_dbl.dbl_exp = DBL_EXP_INFNAN;
+               u.dblu_dbl.dbl_frach = 0;
+               u.dblu_dbl.dbl_fracl = 0;
+               errno = ERANGE;
+               return (u.dblu_d);
+       } else if (newexp <= 0) {
                /*
                 * The output number is either denormal or underflows (see
                 * comments in machine/ieee.h).
@@ -123,15 +135,6 @@
                mul.dblu_dbl.dbl_exp = expon + DBL_EXP_BIAS;
                u.dblu_d *= mul.dblu_d;
                return (u.dblu_d);
-       } else if (newexp >= DBL_EXP_INFNAN) {
-               /*
-                * The result overflowed; return +/-Inf.
-                */
-               u.dblu_dbl.dbl_exp = DBL_EXP_INFNAN;
-               u.dblu_dbl.dbl_frach = 0;
-               u.dblu_dbl.dbl_fracl = 0;
-               errno = ERANGE;
-               return (u.dblu_d);
        } else {
                /*
                 * The result is normal; just replace the old exponent with the



Home | Main Index | Thread Index | Old Index