dnl dnl Enable all known GCC compiler warnings, except for those dnl we can't yet cope with dnl AC_DEFUN([LIBVIRT_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" # Too many to deal with dontwarn="$dontwarn -Wconversion" # Too many to deal with dontwarn="$dontwarn -Wsign-conversion" # GNULIB gettext.h violates dontwarn="$dontwarn -Wvla" # Many GNULIB header violations dontwarn="$dontwarn -Wundef" # Need to allow bad cast for execve() dontwarn="$dontwarn -Wcast-qual" # We need to use long long in many places dontwarn="$dontwarn -Wlong-long" # We allow manual list of all enum cases without default: dontwarn="$dontwarn -Wswitch-default" # We allow optional default: instead of listing all enum values dontwarn="$dontwarn -Wswitch-enum" # Not a problem since we don't use -fstrict-overflow dontwarn="$dontwarn -Wstrict-overflow" # Not a problem since we don't use -funsafe-loop-optimizations dontwarn="$dontwarn -Wunsafe-loop-optimizations" # Things like virAsprintf mean we can't use this dontwarn="$dontwarn -Wformat-nonliteral" # Gnulib's stat-time.h violates this dontwarn="$dontwarn -Waggregate-return" # gcc 4.4.6 complains this is C++ only; gcc 4.7.0 implies this from -Wall dontwarn="$dontwarn -Wenum-compare" # gcc 4.2 treats attribute(format) as an implicit attribute(nonnull), # which triggers spurious warnings for our usage AC_CACHE_CHECK([whether the C compiler's -Wformat allows NULL strings], [lv_cv_gcc_wformat_null_works], [ save_CFLAGS=$CFLAGS CFLAGS='-Wunknown-pragmas -Werror -Wformat' AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include static __attribute__ ((__format__ (__printf__, 1, 2))) int foo (const char *fmt, ...) { return !fmt; } ]], [[ return foo(NULL); ]])], [lv_cv_gcc_wformat_null_works=yes], [lv_cv_gcc_wformat_null_works=no]) CFLAGS=$save_CFLAGS]) # Gnulib uses '#pragma GCC diagnostic push' to silence some # warnings, but older gcc doesn't support this. AC_CACHE_CHECK([whether pragma GCC diagnostic push works], [lv_cv_gcc_pragma_push_works], [ save_CFLAGS=$CFLAGS CFLAGS='-Wunknown-pragmas -Werror' AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #pragma GCC diagnostic push #pragma GCC diagnostic pop ]])], [lv_cv_gcc_pragma_push_works=yes], [lv_cv_gcc_pragma_push_works=no]) CFLAGS=$save_CFLAGS]) if test $lv_cv_gcc_pragma_push_works = no; then dontwarn="$dontwarn -Wmissing-prototypes" dontwarn="$dontwarn -Wmissing-declarations" dontwarn="$dontwarn -Wcast-align" else AC_DEFINE_UNQUOTED([WORKING_PRAGMA_PUSH], 1, [Define to 1 if gcc supports pragma push/pop]) fi dnl Check whether strchr(s, char variable) causes a bogus compile dnl warning, which is the case with GCC < 4.6 on some glibc AC_CACHE_CHECK([whether the C compiler's -Wlogical-op gives bogus warnings], [lv_cv_gcc_wlogical_op_broken], [ save_CFLAGS="$CFLAGS" CFLAGS="-O2 -Wlogical-op -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]], [[ const char *haystack; char needle; return strchr(haystack, needle) == haystack;]])], [lv_cv_gcc_wlogical_op_broken=no], [lv_cv_gcc_wlogical_op_broken=yes]) CFLAGS="$save_CFLAGS"]) # We might fundamentally need some of these disabled forever, but # ideally we'd turn many of them on 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" # 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]) # 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... wantwarn="$wantwarn -Wno-sign-compare" # GNULIB expects this to be part of -Wc++-compat, but we turn # that one off, so we need to manually enable this again wantwarn="$wantwarn -Wjump-misses-init" # GNULIB turns on -Wformat=2 which implies -Wformat-nonliteral, # so we need to manually re-exclude it. Also, older gcc 4.2 # added an implied ATTRIBUTE_NONNULL on any parameter marked # ATTRIBUTE_FMT_PRINT, which causes -Wformat failure on our # intentional use of virReportError(code, NULL). wantwarn="$wantwarn -Wno-format-nonliteral" if test $lv_cv_gcc_wformat_null_works = no; then wantwarn="$wantwarn -Wno-format" fi # This should be < 256 really. Currently we're down to 4096, # but using 1024 bytes sized buffers (mostly for virStrerror) # stops us from going down further wantwarn="$wantwarn -Wframe-larger-than=4096" dnl wantwarn="$wantwarn -Wframe-larger-than=256" # 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 wantwarn="$wantwarn -fstack-protector" wantwarn="$wantwarn -fstack-protector-all" wantwarn="$wantwarn --param=ssp-buffer-size=4" dnl Even though it supports it, clang complains about dnl use of --param=ssp-buffer-size=4 unless used with dnl the -c arg. It doesn't like it when used with args dnl that just link together .o files. Unfortunately dnl we can't avoid that with automake, so we must turn dnl off the following clang specific warning wantwarn="$wantwarn -Wno-unused-command-line-argument" ;; *-*-freebsd*) dnl FreeBSD ships old gcc 4.2.1 which doesn't handle dnl -fstack-protector-all well wantwarn="$wantwarn -fstack-protector" wantwarn="$wantwarn -Wno-unused-command-line-argument" ;; esac wantwarn="$wantwarn -fexceptions" wantwarn="$wantwarn -fasynchronous-unwind-tables" # Need -fipa-pure-const in order to make -Wsuggest-attribute=pure # fire even without -O. wantwarn="$wantwarn -fipa-pure-const" # We should eventually enable this, but right now there are at # least 75 functions triggering warnings. wantwarn="$wantwarn -Wno-suggest-attribute=pure" wantwarn="$wantwarn -Wno-suggest-attribute=const" if test "$set_werror" = "yes" then wantwarn="$wantwarn -Werror" fi # Check for $CC support of each warning for w in $wantwarn; do gl_WARN_ADD([$w]) done # Silence certain warnings in gnulib, and use improved glibc headers AC_DEFINE([lint], [1], [Define to 1 if the compiler is checking for lint.]) AH_VERBATIM([FORTIFY_SOURCE], [/* Enable compile-time and run-time bounds-checking, and some warnings, without upsetting newer glibc. */ #if !defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__ # define _FORTIFY_SOURCE 2 #endif ]) if test "$gl_cv_warn_c__Wlogical_op" = yes && test "$lv_cv_gcc_wlogical_op_broken" = yes; then AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP], 1, [Define to 1 if gcc -Wlogical-op reports false positives on strchr]) fi ])