Enable many more compiler warnings

* m4/manywarnings.m4m, m4/warnings.m4: Import GNULIB warnings
  modules
* m4/spice-compile-warnings.m4: Define SPICE_COMPILE_WARNINGS
* configure.ac: Replace compile warning check with a call to
  SPICE_COMPILE_WARNINGS
* client/Makefile.am: Use WARN_CXXFLAGS instead of WARN_CFLAGS

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2012-03-15 10:40:43 +00:00
parent 39565707a9
commit d986fb466b
5 changed files with 385 additions and 77 deletions

View File

@ -213,7 +213,7 @@ INCLUDES = \
$(SSL_CFLAGS) \
$(XRANDR_CFLAGS) \
$(XFIXES_CFLAGS) \
$(WARN_CFLAGS) \
$(WARN_CXXFLAGS) \
$(XINERAMA_CFLAGS) \
$(CXIMAGE_CFLAGS) \
$(NULL)

View File

@ -394,82 +394,7 @@ fi
dnl ===========================================================================
dnl check compiler flags
AC_DEFUN([SPICE_CC_TRY_FLAG], [
AC_MSG_CHECKING([whether $CC supports $1])
spice_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $1"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ])], [spice_cc_flag=yes], [spice_cc_flag=no])
CFLAGS="$spice_save_CFLAGS"
if test "x$spice_cc_flag" = "xyes"; then
ifelse([$2], , :, [$2])
else
ifelse([$3], , :, [$3])
fi
AC_MSG_RESULT([$spice_cc_flag])
])
dnl Use lots of warning flags with with gcc and compatible compilers
dnl Note: if you change the following variable, the cache is automatically
dnl skipped and all flags rechecked. So there's no need to do anything
dnl else. If for any reason you need to force a recheck, just change
dnl MAYBE_WARN in an ignorable way (like adding whitespace)
dnl MAYBE_WARN="-Wall -Wno-sign-compare -Werror -Wno-deprecated-declarations"
if test "$red_target" = "windows"; then
MAYBE_WARN="-Wall -Wno-sign-compare -Wno-deprecated-declarations"
else
MAYBE_WARN="-Wall -Wno-sign-compare -Wno-deprecated-declarations"
fi
AC_ARG_ENABLE(werror,
AC_HELP_STRING([--enable-werror], [Use -Werror (if supported)]),
set_werror="$enableval",[
if test -f $srcdir/GITVERSION; then
is_git_version=true
set_werror=yes
else
set_werror=no
fi
])
# invalidate cached value if MAYBE_WARN has changed
if test "x$spice_cv_warn_maybe" != "x$MAYBE_WARN"; then
unset spice_cv_warn_cflags
fi
AC_CACHE_CHECK([for supported warning flags], spice_cv_warn_cflags, [
echo
WARN_CFLAGS=""
# Some warning options are not supported by all versions of
# gcc, so test all desired options against the current
# compiler.
#
# Note that there are some order dependencies
# here. Specifically, an option that disables a warning will
# have no net effect if a later option then enables that
# warnings, (perhaps implicitly). So we put some grouped
# options (-Wall and -Wextra) up front and the -Wno options
# last.
for W in $MAYBE_WARN; do
SPICE_CC_TRY_FLAG([$W], [WARN_CFLAGS="$WARN_CFLAGS $W"])
done
if test "$set_werror" != "no"; then
SPICE_CC_TRY_FLAG(["-Werror"], [WARN_CFLAGS="$WARN_CFLAGS -Werror"])
fi
spice_cv_warn_cflags=$WARN_CFLAGS
spice_cv_warn_maybe=$MAYBE_WARN
AC_MSG_CHECKING([which warning flags were supported])])
WARN_CFLAGS="$spice_cv_warn_cflags"
SPICE_CFLAGS="$SPICE_CFLAGS $WARN_CFLAGS"
SPICE_COMPILE_WARNINGS
# use ximage.h for win32 build if it is found (no package for mingw32 atm)
if test $os_win32 == "yes" ; then

184
m4/manywarnings.m4 Normal file
View File

@ -0,0 +1,184 @@
# manywarnings.m4 serial 3
dnl Copyright (C) 2008-2012 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl From Simon Josefsson
# gl_MANYWARN_COMPLEMENT(OUTVAR, LISTVAR, REMOVEVAR)
# --------------------------------------------------
# Copy LISTVAR to OUTVAR except for the entries in REMOVEVAR.
# Elements separated by whitespace. In set logic terms, the function
# does OUTVAR = LISTVAR \ REMOVEVAR.
AC_DEFUN([gl_MANYWARN_COMPLEMENT],
[
gl_warn_set=
set x $2; shift
for gl_warn_item
do
case " $3 " in
*" $gl_warn_item "*)
;;
*)
gl_warn_set="$gl_warn_set $gl_warn_item"
;;
esac
done
$1=$gl_warn_set
])
# gl_MANYWARN_ALL_GCC(VARIABLE)
# -----------------------------
# Add all documented GCC warning parameters to variable VARIABLE.
# Note that you need to test them using gl_WARN_ADD if you want to
# make sure your gcc understands it.
AC_DEFUN([gl_MANYWARN_ALL_GCC],
[
dnl First, check if -Wno-missing-field-initializers is needed.
dnl -Wmissing-field-initializers is implied by -W, but that issues
dnl warnings with GCC version before 4.7, for the common idiom
dnl of initializing types on the stack to zero, using { 0, }
AC_REQUIRE([AC_PROG_CC])
if test -n "$GCC"; then
dnl First, check -W -Werror -Wno-missing-field-initializers is supported
dnl with the current $CC $CFLAGS $CPPFLAGS.
AC_MSG_CHECKING([whether -Wno-missing-field-initializers is supported])
AC_CACHE_VAL([gl_cv_cc_nomfi_supported], [
gl_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -W -Werror -Wno-missing-field-initializers"
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[]], [[]])],
[gl_cv_cc_nomfi_supported=yes],
[gl_cv_cc_nomfi_supported=no])
CFLAGS="$gl_save_CFLAGS"])
AC_MSG_RESULT([$gl_cv_cc_nomfi_supported])
if test "$gl_cv_cc_nomfi_supported" = yes; then
dnl Now check whether -Wno-missing-field-initializers is needed
dnl for the { 0, } construct.
AC_MSG_CHECKING([whether -Wno-missing-field-initializers is needed])
AC_CACHE_VAL([gl_cv_cc_nomfi_needed], [
gl_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -W -Werror"
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[void f (void)
{
typedef struct { int a; int b; } s_t;
s_t s1 = { 0, };
}
]],
[[]])],
[gl_cv_cc_nomfi_needed=no],
[gl_cv_cc_nomfi_needed=yes])
CFLAGS="$gl_save_CFLAGS"
])
AC_MSG_RESULT([$gl_cv_cc_nomfi_needed])
fi
fi
gl_manywarn_set=
for gl_manywarn_item in \
-Wall \
-W \
-Wformat-y2k \
-Wformat-nonliteral \
-Wformat-security \
-Winit-self \
-Wmissing-include-dirs \
-Wswitch-default \
-Wswitch-enum \
-Wunused \
-Wunknown-pragmas \
-Wstrict-aliasing \
-Wstrict-overflow \
-Wsystem-headers \
-Wfloat-equal \
-Wtraditional \
-Wtraditional-conversion \
-Wdeclaration-after-statement \
-Wundef \
-Wshadow \
-Wunsafe-loop-optimizations \
-Wpointer-arith \
-Wbad-function-cast \
-Wc++-compat \
-Wcast-qual \
-Wcast-align \
-Wwrite-strings \
-Wconversion \
-Wsign-conversion \
-Wlogical-op \
-Waggregate-return \
-Wstrict-prototypes \
-Wold-style-definition \
-Wmissing-prototypes \
-Wmissing-declarations \
-Wmissing-noreturn \
-Wmissing-format-attribute \
-Wpacked \
-Wpadded \
-Wredundant-decls \
-Wnested-externs \
-Wunreachable-code \
-Winline \
-Winvalid-pch \
-Wlong-long \
-Wvla \
-Wvolatile-register-var \
-Wdisabled-optimization \
-Wstack-protector \
-Woverlength-strings \
-Wbuiltin-macro-redefined \
-Wmudflap \
-Wpacked-bitfield-compat \
-Wsync-nand \
; do
gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item"
done
# The following are not documented in the manual but are included in
# output from gcc --help=warnings.
for gl_manywarn_item in \
-Wattributes \
-Wcoverage-mismatch \
-Wmultichar \
-Wunused-macros \
; do
gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item"
done
# More warnings from gcc 4.6.2 --help=warnings.
for gl_manywarn_item in \
-Wabi \
-Wcpp \
-Wdeprecated \
-Wdeprecated-declarations \
-Wdiv-by-zero \
-Wdouble-promotion \
-Wendif-labels \
-Wextra \
-Wformat-contains-nul \
-Wformat-extra-args \
-Wformat-zero-length \
-Wformat=2 \
-Wmultichar \
-Wnormalized=nfc \
-Woverflow \
-Wpointer-to-int-cast \
-Wpragmas \
-Wsuggest-attribute=const \
-Wsuggest-attribute=noreturn \
-Wsuggest-attribute=pure \
-Wtrampolines \
; do
gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item"
done
# Disable the missing-field-initializers warning if needed
if test "$gl_cv_cc_nomfi_needed" = yes; then
gl_manywarn_set="$gl_manywarn_set -Wno-missing-field-initializers"
fi
$1=$gl_manywarn_set
])

View File

@ -0,0 +1,162 @@
dnl
dnl Enable all known GCC compiler warnings, except for those
dnl we can't yet cope with
dnl
AC_DEFUN([SPICE_COMPILE_WARNINGS],[
dnl ******************************
dnl More compiler warnings
dnl ******************************
AC_ARG_ENABLE([werror],
AS_HELP_STRING([--enable-werror], [Use -Werror (if supported)]),
[set_werror="$enableval"],
[if test -d $srcdir/.git; then
is_git_version=true
set_werror=yes
else
set_werror=no
fi])
# List of warnings that are not relevant / wanted
# Don't care about C++ compiler compat
dontwarn="$dontwarn -Wc++-compat"
dontwarn="$dontwarn -Wabi"
dontwarn="$dontwarn -Wdeprecated"
# Don't care about ancient C standard compat
dontwarn="$dontwarn -Wtraditional"
# Don't care about ancient C standard compat
dontwarn="$dontwarn -Wtraditional-conversion"
# Ignore warnings in /usr/include
dontwarn="$dontwarn -Wsystem-headers"
# Happy for compiler to add struct padding
dontwarn="$dontwarn -Wpadded"
# GCC very confused with -O2
dontwarn="$dontwarn -Wunreachable-code"
dontwarn="$dontwarn -Wconversion"
dontwarn="$dontwarn -Wsign-conversion"
dontwarn="$dontwarn -Wvla"
dontwarn="$dontwarn -Wundef"
dontwarn="$dontwarn -Wcast-qual"
dontwarn="$dontwarn -Wlong-long"
dontwarn="$dontwarn -Wswitch-default"
dontwarn="$dontwarn -Wswitch-enum"
dontwarn="$dontwarn -Wstrict-overflow"
dontwarn="$dontwarn -Wunsafe-loop-optimizations"
dontwarn="$dontwarn -Wformat-nonliteral"
dontwarn="$dontwarn -Wfloat-equal"
dontwarn="$dontwarn -Wdeclaration-after-statement"
dontwarn="$dontwarn -Wcast-qual"
dontwarn="$dontwarn -Wconversion"
dontwarn="$dontwarn -Wsign-conversion"
dontwarn="$dontwarn -Wpacked"
dontwarn="$dontwarn -Wunused-macros"
dontwarn="$dontwarn -Woverlength-strings"
dontwarn="$dontwarn -Wstack-protector"
dontwarn="$dontwarn -Winline"
dontwarn="$dontwarn -Wbad-function-cast"
dontwarn="$dontwarn -Wshadow"
# We want to enable thse, but need to sort out the
# decl mess with gtk/generated_*.c
dontwarn="$dontwarn -Wmissing-prototypes"
dontwarn="$dontwarn -Wmissing-declarations"
# Stuff that C++ won't allow. Turn them back on later
dontwarn="$dontwarn -Waggregate-return"
dontwarn="$dontwarn -Wstrict-prototypes"
dontwarn="$dontwarn -Wold-style-definition"
dontwarn="$dontwarn -Wnested-externs"
dontwarn="$dontwarn -Wformat-zero-length"
dontwarn="$dontwarn -Wpointer-to-int-cast"
dontwarn="$dontwarn -Wjump-misses-init"
# Issues in x11/platform_utils.cpp prevent us turning this on
dontwarn="$dontwarn -Wmissing-format-attribute"
# 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
# GNULIB uses '-W' (aka -Wextra) which includes a bunch of stuff.
# Unfortunately, this means you can't simply use '-Wsign-compare'
# with gl_MANYWARN_COMPLEMENT
# So we have -W enabled, and then have to explicitly turn off...
gl_WARN_ADD([-Wno-sign-compare])
gl_WARN_ADD([-Wno-unused-parameter])
# We can't enable this due to horrible spice_usb_device_get_description
# signature
gl_WARN_ADD([-Wno-format-nonliteral])
# CEGui headers cause violation of this
gl_WARN_ADD([-Wno-ignored-qualifiers])
# GNULIB turns on -Wformat=2 which implies -Wformat-nonliteral,
# so we need to manually re-exclude it.
gl_WARN_ADD([-Wno-format-nonliteral])
# This should be < 1024 really. pixman_utils is the blackspot
# preventing lower usage
gl_WARN_ADD([-Wframe-larger-than=20460])
# Use improved glibc headers
AC_DEFINE([_FORTIFY_SOURCE], [2],
[enable compile-time and run-time bounds-checking, and some warnings])
# Extra special flags
dnl -fstack-protector stuff passes gl_WARN_ADD with gcc
dnl on Mingw32, but fails when actually used
case $host in
*-*-linux*)
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])
;;
esac
gl_WARN_ADD([-fexceptions])
gl_WARN_ADD([-fasynchronous-unwind-tables])
gl_WARN_ADD([-fdiagnostics-show-option])
gl_WARN_ADD([-funit-at-a-time])
# Need -fipa-pure-const in order to make -Wsuggest-attribute=pure
# fire even without -O.
gl_WARN_ADD([-fipa-pure-const])
# We should eventually enable this, but right now there are at
# least 75 functions triggering warnings.
gl_WARN_ADD([-Wno-suggest-attribute=pure])
gl_WARN_ADD([-Wno-suggest-attribute=const])
if test "$set_werror" = "yes"
then
gl_WARN_ADD([-Werror])
fi
WARN_CXXFLAGS=$WARN_CFLAGS
AC_SUBST([WARN_CXXFLAGS])
# These are C-only warnings
gl_WARN_ADD([-Waggregate-return])
gl_WARN_ADD([-Wstrict-prototypes])
gl_WARN_ADD([-Wold-style-definition])
gl_WARN_ADD([-Wnested-externs])
gl_WARN_ADD([-Wformat-zero-length])
gl_WARN_ADD([-Wpointer-to-int-cast])
gl_WARN_ADD([-Wjump-misses-init])
WARN_LDFLAGS=$WARN_CFLAGS
AC_SUBST([WARN_CFLAGS])
AC_SUBST([WARN_LDFLAGS])
])

37
m4/warnings.m4 Normal file
View File

@ -0,0 +1,37 @@
# warnings.m4 serial 5
dnl Copyright (C) 2008-2012 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl From Simon Josefsson
# gl_AS_VAR_APPEND(VAR, VALUE)
# ----------------------------
# Provide the functionality of AS_VAR_APPEND if Autoconf does not have it.
m4_ifdef([AS_VAR_APPEND],
[m4_copy([AS_VAR_APPEND], [gl_AS_VAR_APPEND])],
[m4_define([gl_AS_VAR_APPEND],
[AS_VAR_SET([$1], [AS_VAR_GET([$1])$2])])])
# gl_WARN_ADD(PARAMETER, [VARIABLE = WARN_CFLAGS])
# ------------------------------------------------
# Adds parameter to WARN_CFLAGS if the compiler supports it. For example,
# gl_WARN_ADD([-Wparentheses]).
AC_DEFUN([gl_WARN_ADD],
dnl FIXME: gl_Warn must be used unquoted until we can assume
dnl autoconf 2.64 or newer.
[AS_VAR_PUSHDEF([gl_Warn], [gl_cv_warn_$1])dnl
AC_CACHE_CHECK([whether compiler handles $1], m4_defn([gl_Warn]), [
gl_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="${CPPFLAGS} $1"
AC_PREPROC_IFELSE([AC_LANG_PROGRAM([])],
[AS_VAR_SET(gl_Warn, [yes])],
[AS_VAR_SET(gl_Warn, [no])])
CPPFLAGS="$gl_save_CPPFLAGS"
])
AS_VAR_IF(gl_Warn, [yes],
[gl_AS_VAR_APPEND(m4_if([$2], [], [[WARN_CFLAGS]], [[$2]]), [" $1"])])
AS_VAR_POPDEF([gl_Warn])dnl
m4_ifval([$2], [AS_LITERAL_IF([$2], [AC_SUBST([$2])], [])])dnl
])