Fix lgamma implementations for -Wuninitialized.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 21 May 2015 23:44:33 +0000 (23:44 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 21 May 2015 23:44:33 +0000 (23:44 +0000)
If you remove the "override CFLAGS += -Wno-uninitialized" in
math/Makefile, you get errors from lgamma implementations of the form:

../sysdeps/ieee754/dbl-64/e_lgamma_r.c: In function '__ieee754_lgamma_r':
../sysdeps/ieee754/dbl-64/e_lgamma_r.c:297:13: error: 'nadj' may be used uninitialized in this function [-Werror=maybe-uninitialized]
  if(hx<0) r = nadj - r;

This is one of the standard kinds of false positive uninitialized
warnings: nadj is set under a certain condition, and then later used
under the same condition.  This patch uses DIAG_* macros to suppress
the warning on the use of nadj.  The ldbl-128 / ldbl-128ibm
implementation has a substantially different structure that avoids
this issue.

Tested for x86_64.  (In fact this patch eliminates the need for that
-Wno-uninitialized on x86_64, but I want to test on more architectures
before removing it.)

* sysdeps/ieee754/dbl-64/e_lgamma_r.c: Include <libc-internal.h>.
(__ieee754_lgamma_r): Ignore uninitialized warnings around use of
NADJ.
* sysdeps/ieee754/flt-32/e_lgammaf_r.c: Include <libc-internal.h>.
(__ieee754_lgammaf_r): Ignore uninitialized warnings around use of
NADJ.
* sysdeps/ieee754/ldbl-96/e_lgammal_r.c: Include <libc-internal.h>.
(__ieee754_lgammal_r): Ignore uninitialized warnings around use of
NADJ.

ChangeLog
sysdeps/ieee754/dbl-64/e_lgamma_r.c
sysdeps/ieee754/flt-32/e_lgammaf_r.c
sysdeps/ieee754/ldbl-96/e_lgammal_r.c

index bca6ba7a3fe293803b5545595d89ab76a0c83e21..ba7a400e5316aa59e474d34fce48e314272ddd5b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2015-05-21  Joseph Myers  <joseph@codesourcery.com>
 
+       * sysdeps/ieee754/dbl-64/e_lgamma_r.c: Include <libc-internal.h>.
+       (__ieee754_lgamma_r): Ignore uninitialized warnings around use of
+       NADJ.
+       * sysdeps/ieee754/flt-32/e_lgammaf_r.c: Include <libc-internal.h>.
+       (__ieee754_lgammaf_r): Ignore uninitialized warnings around use of
+       NADJ.
+       * sysdeps/ieee754/ldbl-96/e_lgammal_r.c: Include <libc-internal.h>.
+       (__ieee754_lgammal_r): Ignore uninitialized warnings around use of
+       NADJ.
+
        * sysdeps/ieee754/dbl-64/mpa.c (norm): Remove if condition on
        (p == 4) case.
 
index af7d06c82f5f2334642251c234c2262ea0b6bdf0..fc6f594d62137531496be3e23d7d407a489d715a 100644 (file)
@@ -77,6 +77,7 @@
  *
  */
 
+#include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -294,7 +295,18 @@ __ieee754_lgamma_r(double x, int *signgamp)
        } else
     /* 2**58 <= x <= inf */
            r =  x*(__ieee754_log(x)-one);
+       /* NADJ is set for negative arguments but not otherwise,
+          resulting in warnings that it may be used uninitialized
+          although in the cases where it is used it has always been
+          set.  */
+       DIAG_PUSH_NEEDS_COMMENT;
+#if __GNUC_PREREQ (4, 7)
+       DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
+#else
+       DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wuninitialized");
+#endif
        if(hx<0) r = nadj - r;
+       DIAG_POP_NEEDS_COMMENT;
        return r;
 }
 strong_alias (__ieee754_lgamma_r, __lgamma_r_finite)
index 4743bee438c014003a65ae2199bfd2a53bb59ada..c0bf4156ffa4971179db4fbd2a05de2db7bb5082 100644 (file)
@@ -13,6 +13,7 @@
  * ====================================================
  */
 
+#include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -229,7 +230,18 @@ __ieee754_lgammaf_r(float x, int *signgamp)
        } else
     /* 2**26 <= x <= inf */
            r =  x*(__ieee754_logf(x)-one);
+       /* NADJ is set for negative arguments but not otherwise,
+          resulting in warnings that it may be used uninitialized
+          although in the cases where it is used it has always been
+          set.  */
+       DIAG_PUSH_NEEDS_COMMENT;
+#if __GNUC_PREREQ (4, 7)
+       DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
+#else
+       DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wuninitialized");
+#endif
        if(hx<0) r = nadj - r;
+       DIAG_POP_NEEDS_COMMENT;
        return r;
 }
 strong_alias (__ieee754_lgammaf_r, __lgammaf_r_finite)
index 1a95f846ae808301726576e74e7d8a6fd5db2c8c..0cc35f925223985185551c7c379fa0f8e777726a 100644 (file)
@@ -91,6 +91,7 @@
  *
  */
 
+#include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
 
@@ -423,8 +424,18 @@ __ieee754_lgammal_r (long double x, int *signgamp)
   else
     /* 2**66 <= x <= inf */
     r = x * (__ieee754_logl (x) - one);
+  /* NADJ is set for negative arguments but not otherwise, resulting
+     in warnings that it may be used uninitialized although in the
+     cases where it is used it has always been set.  */
+  DIAG_PUSH_NEEDS_COMMENT;
+#if __GNUC_PREREQ (4, 7)
+  DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
+#else
+  DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wuninitialized");
+#endif
   if (se & 0x8000)
     r = nadj - r;
+  DIAG_POP_NEEDS_COMMENT;
   return r;
 }
 strong_alias (__ieee754_lgammal_r, __lgammal_r_finite)