On 21/05/2020 01:49, Paul Eggert wrote:
The coreutils patch installed on May 10 to pacify GCC 10 -fanalyzer
caused problems when I built coreutils with GCC 10.1.0. Some of the
newly-introduced pragmas generated diagnostics, and the pragmas didn't
seem to be needed in GCC 10.1.0 anyway. As 10.1.0 is the first public
release of GCC 10 I doubt whether we need to support GCC internal
versions (before GCC 10.1.0) that had problems with -fanalyze.

Also, the patch seems to have introduced a bug in tsort.c due to a typo.
Less importantly, it introduced some new overhead in dd.c's non-lint
code (to save some pointers in global variables) that isn't needed and
might cause problems with other static checkers.

To try to fix all this I installed the attached patches.

At some point I hope this GCC 10 stuff settles down, as GCC 10.1.0 still
has bugs in the -fanalyzer area (e.g., see GCC bugs 93644, 95044, 95072)
and we don't want these bugs to adversely affect coreutils etc.

Previously I was testing with the first Fedora 32 (public) GCC:
  gcc (GCC) 10.0.1 20200328 (Red Hat 10.0.1-0.11)

After just upgrading:
  sudo dnf upgrade --advisory=FEDORA-2020-2c6c85202d
  gcc (GCC) 10.1.1 20200507 (Red Hat 10.1.1-1)

I can confirm that the comm.c pragma causes issues for gcc 10.1
  src/comm.c:21:33: error: unknown option after '#pragma GCC diagnostic' kind 
[-Werror=pragmas]
   21 | # pragma GCC diagnostic ignored "-Wanalyzer-use-of-uninitialized-value"

The good news is that this is no longer needed to suppress
-fanalyzer warnings, so we can just remove it.

The other pragmas are still needed though to suppress -fanalyzer warnings.

Also the dd change has minimal overhead and makes valgrind output cleaner.

Good spot on the misplaced #endif in tsort.

I would have went for the smaller attached change,
to avoid the -fanalyzer failures?

thanks for the fixes,
Pádraig
>From d0e669684cecb5d90d785debc05aefb78057afe2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <p...@draigbrady.com>
Date: Thu, 21 May 2020 13:21:45 +0100
Subject: [PATCH] maint: fix issues with recent gcc -fanalyzer change

* src/comm.c: This pragma is no longer needed (or supported)
on GCC 10.1.0.
* src/tsort.c: Fix the misplaced endif to ensure the code
is included in all cases.
---
 src/comm.c  | 5 -----
 src/tsort.c | 2 ++
 2 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/src/comm.c b/src/comm.c
index 826023c34..2bf8094bf 100644
--- a/src/comm.c
+++ b/src/comm.c
@@ -16,11 +16,6 @@
 
 /* Written by Richard Stallman and David MacKenzie. */
 
-/* GCC 10 gives a false postive warning with -fanalyzer for this.  */
-#if (__GNUC__ == 10 && 0 <= __GNUC_MINOR__) || 10 < __GNUC__
-# pragma GCC diagnostic ignored "-Wanalyzer-use-of-uninitialized-value"
-#endif
-
 #include <config.h>
 
 #include <getopt.h>
diff --git a/src/tsort.c b/src/tsort.c
index cff2d3a65..8373ca161 100644
--- a/src/tsort.c
+++ b/src/tsort.c
@@ -280,6 +280,7 @@ record_relation (struct item *j, struct item *k)
 #if (__GNUC__ == 10 && 0 <= __GNUC_MINOR__) || 10 < __GNUC__
 # pragma GCC diagnostic push
 # pragma GCC diagnostic ignored "-Wanalyzer-null-dereference"
+#endif
   if (!STREQ (j->str, k->str))
     {
       k->count++;
@@ -288,6 +289,7 @@ record_relation (struct item *j, struct item *k)
       p->next = j->top;
       j->top = p;
     }
+#if (__GNUC__ == 10 && 0 <= __GNUC_MINOR__) || 10 < __GNUC__
 # pragma GCC diagnostic pop
 #endif
 }
-- 
2.26.2

Reply via email to