[libvirt] [PATCH] Use gnulib's manywarnings & warnings modules

Daniel P. Berrange berrange at redhat.com
Fri Apr 1 15:39:05 UTC 2011


Remove custom code for checking compiler warnings, using
gl_WARN_ADD instead. Don't list all flags ourselves, use
gnulib's gl_MANYWARN_ALL_GCC to get all possible GCC flags,
then turn off the ones we don't want yet.

This patch alone doesn't buy us much. What we want is some
more followup patches, which remove entries from the
'dontwarn' list, fixing up the corresponding code problems.

We also need to fix our stack usage in many places so we can
lower the ridiculous size of  -Wframe-larger-than=20480

* acinclude.m4: Rewrite to use gl_WARN_ADD and gl_MANYWARN_ALL_GCC
* bootstrap.conf: Add warnings & manywarnings
* configure.ac: Switch to gl_WARN_ADD
* m4/compiler-flags.m4: Obsoleted by gl_WARN_ADD
---
 acinclude.m4         |  153 ++++++++++++++++++++++++++------------------------
 bootstrap.conf       |    2 +
 configure.ac         |   15 +++--
 m4/compiler-flags.m4 |   48 ----------------
 4 files changed, 91 insertions(+), 127 deletions(-)
 delete mode 100644 m4/compiler-flags.m4

diff --git a/acinclude.m4 b/acinclude.m4
index 838ec46..63bfec7 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -1,11 +1,6 @@
 dnl
-dnl Taken from gnome-common/macros2/gnome-compiler-flags.m4
-dnl
-dnl We've added:
-dnl   -Wextra -Wshadow -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Winline -Wredundant-decls
-dnl We've removed
-dnl   CFLAGS="$realsave_CFLAGS"
-dnl   to avoid clobbering user-specified CFLAGS
+dnl Enable all known GCC compiler warnings, except for those
+dnl we can't yet cope with
 dnl
 AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
     dnl ******************************
@@ -13,90 +8,102 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
     dnl ******************************
 
     AC_ARG_ENABLE(compile-warnings,
-                  [AC_HELP_STRING([--enable-compile-warnings=@<:@no/minimum/yes/maximum/error@:>@],
+                  [AC_HELP_STRING([--enable-compile-warnings=@<:@no/yes/error@:>@],
                                  [Turn on compiler warnings])],,
-                  [enable_compile_warnings="m4_default([$1],[maximum])"])
-
-    warnCFLAGS=
-
-    common_flags=
-    common_flags="$common_flags -Wp,-D_FORTIFY_SOURCE=2"
-    common_flags="$common_flags -fexceptions"
-    common_flags="$common_flags -fasynchronous-unwind-tables"
-    common_flags="$common_flags -fdiagnostics-show-option"
+                  [enable_compile_warnings="m4_default([$1],[yes])"])
 
     case "$enable_compile_warnings" in
     no)
         try_compiler_flags=""
 	;;
-    minimum)
-	try_compiler_flags="-Wall -Wformat -Wformat-security $common_flags"
-	;;
-    yes)
-	try_compiler_flags="-Wall -Wformat -Wformat-security -Wmissing-prototypes $common_flags"
-	;;
-    maximum|error)
-	try_compiler_flags="-Wall -Wformat -Wformat-security"
-	try_compiler_flags="$try_compiler_flags -Wmissing-prototypes"
-	try_compiler_flags="$try_compiler_flags -Wnested-externs "
-	try_compiler_flags="$try_compiler_flags -Wpointer-arith"
-	try_compiler_flags="$try_compiler_flags -Wextra -Wshadow"
-	try_compiler_flags="$try_compiler_flags -Wcast-align"
-	try_compiler_flags="$try_compiler_flags -Wwrite-strings"
-	try_compiler_flags="$try_compiler_flags -Waggregate-return"
-	try_compiler_flags="$try_compiler_flags -Wstrict-prototypes"
-	try_compiler_flags="$try_compiler_flags -Winline"
-	try_compiler_flags="$try_compiler_flags -Wredundant-decls"
-	try_compiler_flags="$try_compiler_flags -Wno-sign-compare"
-	try_compiler_flags="$try_compiler_flags -Wlogical-op"
-	try_compiler_flags="$try_compiler_flags $common_flags"
-	if test "$enable_compile_warnings" = "error" ; then
-	    try_compiler_flags="$try_compiler_flags -Werror"
-	fi
+    yes|minimum|maximum|error)
+
+        # List of warnings that are not relevant / wanted
+        dontwarn="$dontwarn -Wc++-compat"             # Don't care about C++ compiler compat
+        dontwarn="$dontwarn -Wtraditional"            # Don't care about ancient C standard compat
+        dontwarn="$dontwarn -Wtraditional-conversion" # Don't care about ancient C standard compat
+        dontwarn="$dontwarn -Wsystem-headers"         # Ignore warnings in /usr/include
+        dontwarn="$dontwarn -Wpadded"                 # Happy for compiler to add struct padding
+        dontwarn="$dontwarn -Wunreachable-code"       # GCC very confused with -O2
+        dontwarn="$dontwarn -Wconversion"             # Too many to deal with
+        dontwarn="$dontwarn -Wsign-conversion"        # Too many to deal with
+        dontwarn="$dontwarn -Wvla"                    # GNULIB gettext.h violates
+        dontwarn="$dontwarn -Wundef"                  # Many GNULIB violations
+        dontwarn="$dontwarn -Wcast-qual"              # Need to allow bad cast for execve()
+        dontwarn="$dontwarn -Wlong-long"              # We need to use long long in many places
+
+        # We might fundamentally need some of these disabled forever, but ideally
+        # we'd turn many of them on
+        dontwarn="$dontwarn -Wformat-nonliteral"
+        dontwarn="$dontwarn -Wswitch-default"
+        dontwarn="$dontwarn -Wswitch-enum"
+        dontwarn="$dontwarn -Wstrict-overflow"
+        dontwarn="$dontwarn -Wfloat-equal"
+        dontwarn="$dontwarn -Wdeclaration-after-statement"
+        dontwarn="$dontwarn -Wunsafe-loop-optimizations"
+        dontwarn="$dontwarn -Wcast-qual"
+        dontwarn="$dontwarn -Wconversion"
+        dontwarn="$dontwarn -Wsign-conversion"
+        dontwarn="$dontwarn -Wold-style-definition"
+        dontwarn="$dontwarn -Wmissing-noreturn"
+        dontwarn="$dontwarn -Wpacked"
+        dontwarn="$dontwarn -Wunused-macros"
+        dontwarn="$dontwarn -W"
+        dontwarn="$dontwarn -Woverlength-strings"
+        dontwarn="$dontwarn -Wmissing-format-attribute"
+        dontwarn="$dontwarn -Wstack-protector"
+
+        # Get all possible GCC warnings
+        gl_MANYWARN_ALL_GCC([maybewarn])
+
+        # Remove the ones we don't want, blacklisted earlier
+        gl_MANYWARN_COMPLEMENT([wantwarn], [$maybewarn], [$dontwarn])
+
+        # Check for $CC support of each warning
+        for w in $wantwarn; do
+          gl_WARN_ADD([$w])
+        done
+
+        # This should be < 256 really, but with PATH_MAX everywhere
+        # we have doom, even with 4096. In fact we have some functions
+        # with several PATH_MAX sized variables :-( We should kill off
+        # all PATH_MAX usage and then lower this limit
+        gl_WARN_ADD([-Wframe-larger-than=20480])
+        dnl gl_WARN_ADD([-Wframe-larger-than=4096])
+        dnl gl_WARN_ADD([-Wframe-larger-than=256])
+
+        # Extra special flags
+        gl_WARN_ADD([-Wp,-D_FORTIFY_SOURCE=2])
+        dnl Fedora only uses -fstack-protector, but doesn't seem to
+        dnl be great overhead in adding -fstack-protector-all instead
+        dnl gl_WARN_ADD([-fstack-protector])
+        gl_WARN_ADD([-fstack-protector-all])
+        gl_WARN_ADD([--param=ssp-buffer-size=4])
+        gl_WARN_ADD([-fexceptions])
+        gl_WARN_ADD([-fasynchronous-unwind-tables])
+        gl_WARN_ADD([-fdiagnostics-show-option])
+
+        if test "$enable_compile_warnings" = "error"
+        then
+          gl_WARN_ADD([-Werror])
+        fi
 	;;
     *)
 	AC_MSG_ERROR(Unknown argument '$enable_compile_warnings' to --enable-compile-warnings)
 	;;
     esac
 
-    COMPILER_FLAGS=
-    for option in $try_compiler_flags; do
-        gl_COMPILER_FLAGS($option)
-    done
-    unset option
-    unset try_compiler_flags
-
-    AC_ARG_ENABLE(iso-c,
-                  AC_HELP_STRING([--enable-iso-c],
-                                 [Try to warn if code is not ISO C ]),,
-                  [enable_iso_c=no])
-
-    AC_MSG_CHECKING(what language compliance flags to pass to the C compiler)
-    complCFLAGS=
-    if test "x$enable_iso_c" != "xno"; then
-	if test "x$GCC" = "xyes"; then
-	case " $CFLAGS " in
-	    *[\ \	]-ansi[\ \	]*) ;;
-	    *) complCFLAGS="$complCFLAGS -ansi" ;;
-	esac
-	case " $CFLAGS " in
-	    *[\ \	]-pedantic[\ \	]*) ;;
-	    *) complCFLAGS="$complCFLAGS -pedantic" ;;
-	esac
-	fi
-    fi
-    AC_MSG_RESULT($complCFLAGS)
-
-    WARN_CFLAGS="$COMPILER_FLAGS $complCFLAGS"
     WARN_LDFLAGS=$WARN_CFLAGS
     AC_SUBST([WARN_CFLAGS])
     AC_SUBST([WARN_LDFLAGS])
 
     dnl Needed to keep compile quiet on python 2.4
-    COMPILER_FLAGS=
-    gl_COMPILER_FLAGS(-Wno-redundant-decls)
-    WARN_PYTHON_CFLAGS=$COMPILER_FLAGS
+    save_WARN_CFLAGS=$WARN_CFLAGS
+    WARN_CFLAGS=
+    gl_WARN_ADD(-Wno-redundant-decls)
+    WARN_PYTHON_CFLAGS=$WARN_CFLAGS
     AC_SUBST(WARN_PYTHON_CFLAGS)
+    WARN_CFLAGS=$save_WARN_CFLAGS
 ])
 
 
diff --git a/bootstrap.conf b/bootstrap.conf
index 733c354..e8cdf76 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -45,6 +45,7 @@ ignore-value
 inet_pton
 ioctl
 maintainer-makefile
+manywarnings
 mkstemp
 mkstemps
 mktempd
@@ -80,6 +81,7 @@ timegm
 uname
 useless-if-before-free
 usleep
+warnings
 vasprintf
 verify
 vc-list-files
diff --git a/configure.ac b/configure.ac
index 2378d9a..0b9855b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1970,12 +1970,14 @@ AC_ARG_ENABLE([test-coverage],
 enable_coverage=$enableval
 
 if test "${enable_coverage}" = yes; then
-  COMPILER_FLAGS=
-  gl_COMPILER_FLAGS(-fprofile-arcs)
-  gl_COMPILER_FLAGS(-ftest-coverage)
-  AC_SUBST([COVERAGE_CFLAGS], [$COMPILER_FLAGS])
-  AC_SUBST([COVERAGE_LDFLAGS], [$COMPILER_FLAGS])
-  COMPILER_FLAGS=
+  save_WARN_CFLAGS=$WARN_CFLAGS
+  WARN_CFLAGS=
+  gl_WARN_ADD(-fprofile-arcs)
+  gl_WARN_ADD(-ftest-coverage)
+  COVERAGE_FLAGS=$WARN_CFLAGS
+  AC_SUBST([COVERAGE_CFLAGS], [$COVERAGE_FLAGS])
+  AC_SUBST([COVERAGE_LDFLAGS], [$COVERAGE_FLAGS])
+  WARN_CFLAGS=$save_WARN_CFLAGS
 fi
 
 AC_ARG_ENABLE([test-oom],
@@ -2538,6 +2540,7 @@ AC_MSG_NOTICE([Miscellaneous])
 AC_MSG_NOTICE([])
 AC_MSG_NOTICE([        Debug: $enable_debug])
 AC_MSG_NOTICE([     Warnings: $enable_compile_warnings])
+AC_MSG_NOTICE([Warning Flags: $WARN_CFLAGS])
 AC_MSG_NOTICE([     Readline: $lv_use_readline])
 AC_MSG_NOTICE([       Python: $with_python])
 AC_MSG_NOTICE([       DTrace: $with_dtrace])
diff --git a/m4/compiler-flags.m4 b/m4/compiler-flags.m4
deleted file mode 100644
index 6db4816..0000000
--- a/m4/compiler-flags.m4
+++ /dev/null
@@ -1,48 +0,0 @@
-# serial 4
-# Find valid warning flags for the C Compiler.           -*-Autoconf-*-
-#
-# Copyright (C) 2010 Red Hat, Inc.
-# Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
-
-# Written by Jesse Thilo.
-
-AC_DEFUN([gl_COMPILER_FLAGS],
-  [AC_MSG_CHECKING(whether compiler accepts $1)
-   ac_save_CFLAGS="$CFLAGS"
-   dnl Some flags are dependant, so we set all previously checked
-   dnl flags when testing. Except for -Werror which we have to
-   dnl check on its own, because some of our compiler flags cause
-   dnl warnings from the autoconf test program!
-   if test "$1" = "-Werror" ; then
-     CFLAGS="$CFLAGS $1"
-   else
-     CFLAGS="$CFLAGS $COMPILER_FLAGS $1"
-   fi
-   AC_TRY_LINK([], [], has_option=yes, has_option=no,)
-   echo 'int x;' >conftest.c
-   $CC $CFLAGS -c conftest.c 2>conftest.err
-   ret=$?
-   if test $ret != 0 || test -s conftest.err || test $has_option = "no"; then
-       AC_MSG_RESULT(no)
-   else
-       AC_MSG_RESULT(yes)
-       COMPILER_FLAGS="$COMPILER_FLAGS $1"
-   fi
-   CFLAGS="$ac_save_CFLAGS"
-   rm -f conftest*
- ])
-- 
1.7.4




More information about the libvir-list mailing list