]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix uninitialized variable use in ldbl-128ibm nearbyintl.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 20 Aug 2015 17:28:09 +0000 (17:28 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 20 Aug 2015 17:28:09 +0000 (17:28 +0000)
Removing the use of -Wno-uninitialized for math/ shows errors for
ldbl-128ibm:

../sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c: In function '__nearbyintl':
../sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c:119:34: error: 'low' may be used uninitialized in this function [-Werror=maybe-uninitialized]
       u.d[1].d = high - u.d[0].d + low;
                                  ^
../sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c:119:23: error: 'high' may be used uninitialized in this function [-Werror=maybe-uninitialized]
       u.d[1].d = high - u.d[0].d + low;
                       ^

These errors are correct: if the high part of the argument is a NaN,
and the low part is nonzero but has absolute value less than 2^52,
those variables can be used uninitialized.  This patch rearranges the
code so that the variables are always initialized with the natural
values, and then possibly modified later, to avoid this uninitialized
use.  (Note that there are still other issues with this code and NaNs
that are not fixed by this patch.)  No bug filed in Bugzilla or
testcase added for the uninitialized use since it wasn't user-visible
with the compiler I tried (that is, I still got a NaN result).

Tested for powerpc.

* sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c: Always initialize
variables for high and low parts before possibly modifying them.

ChangeLog
sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c

index 1de3a2379efd4f9c1255a345cdb0f8e8f011b06f..93d556311e3a2a4737dcfde4bfb31300aac7bb66 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-08-20  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/ieee754/ldbl-128ibm/s_nearbyintl.c: Always initialize
+       variables for high and low parts before possibly modifying them.
+
 2015-08-20  H.J. Lu  <hongjiu.lu@intel.com>
 
        * sysdeps/i386/i686/multiarch/init-arch.h: Removed.
index ef1b3dca1e89942353733123f11f9c6ea5265b52..5f92a5fee845dec0f94c9d332b78e0f1d163c503 100644 (file)
@@ -65,7 +65,7 @@ __nearbyintl (long double x)
     }
   else if (fabs (u.d[1].d) < TWO52 && u.d[1].d != 0.0)
     {
-      double high, low, tau;
+      double high = u.d[0].d, low = u.d[1].d, tau;
       /* In this case we have to round the low double and handle any
          adjustment to the high double that may be caused by rounding
          (up).  This is complicated by the fact that the high double
@@ -78,8 +78,6 @@ __nearbyintl (long double x)
            {
              /* If the high/low doubles are the same sign then simply
                 round the low double.  */
-             high = u.d[0].d;
-             low = u.d[1].d;
            }
          else if (u.d[1].d < 0.0)
            {
@@ -88,8 +86,8 @@ __nearbyintl (long double x)
 
              tau = __nextafter (u.d[0].d, 0.0);
              tau = (u.d[0].d - tau) * 2.0;
-             high = u.d[0].d - tau;
-             low = u.d[1].d + tau;
+             high -= tau;
+             low += tau;
            }
          low += TWO52;
          low -= TWO52;
@@ -100,8 +98,6 @@ __nearbyintl (long double x)
            {
              /* If the high/low doubles are the same sign then simply
                 round the low double.  */
-             high = u.d[0].d;
-             low = u.d[1].d;
            }
          else if (u.d[1].d > 0.0)
            {
@@ -109,8 +105,8 @@ __nearbyintl (long double x)
                 adjust for that.  */
              tau = __nextafter (u.d[0].d, 0.0);
              tau = (u.d[0].d - tau) * 2.0;
-             high = u.d[0].d - tau;
-             low = u.d[1].d + tau;
+             high -= tau;
+             low += tau;
            }
          low = TWO52 - low;
          low = -(low - TWO52);