2007-03-01 16:18:55 +00:00
dnl
2010-07-16 16:04:05 +01:00
dnl Enable all known GCC compiler warnings, except for those
dnl we can't yet cope with
2007-03-01 16:18:55 +00:00
dnl
AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
dnl ******************************
dnl More compiler warnings
dnl ******************************
2016-12-13 13:34:42 +01:00
LIBVIRT_ARG_ENABLE([WERROR], [Use -Werror (if supported)], [check])
if test "$enable_werror" = "check"; then
if test -d $srcdir/.git; then
is_git_version=true
enable_werror=yes
else
enable_werror=no
fi
fi
2012-03-27 16:47:11 +01:00
# 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"
# 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"
# 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"
2012-09-07 11:42:10 -06:00
# gcc 4.4.6 complains this is C++ only; gcc 4.7.0 implies this from -Wall
dontwarn="$dontwarn -Wenum-compare"
2015-05-25 21:33:24 -06:00
# gcc 5.1 -Wformat-signedness mishandles enums, not ready for prime time
dontwarn="$dontwarn -Wformat-signedness"
2017-06-14 15:10:02 +01:00
# Several conditionals expand the same on both branches
# depending on the particular platform/architecture
dontwarn="$dontwarn -Wduplicated-branches"
2017-09-05 16:37:50 +02:00
# > This warning does not generally indicate that there is anything wrong
# > with your code; it merely indicates that GCC's optimizers are unable
# > to handle the code effectively.
# Source: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
dontwarn="$dontwarn -Wdisabled-optimization"
2019-07-30 10:13:36 +01:00
# Various valid glib APIs/macros trigger this warning
dontwarn="$dontwarn -Wbad-function-cast"
2012-03-27 16:47:11 +01:00
2019-07-30 14:07:24 +01:00
# Broken in 6.0 and later
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602
2016-04-10 18:22:20 +02:00
AC_CACHE_CHECK([whether gcc gives bogus warnings for -Wlogical-op],
[lv_cv_gcc_wlogical_op_equal_expr_broken], [
save_CFLAGS="$CFLAGS"
CFLAGS="-O2 -Wlogical-op -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define TEST1 1
#define TEST2 TEST1
]], [[
int test = 0;
return test == TEST1 || test == TEST2;]])],
[lv_cv_gcc_wlogical_op_equal_expr_broken=no],
[lv_cv_gcc_wlogical_op_equal_expr_broken=yes])
CFLAGS="$save_CFLAGS"])
2017-08-11 17:23:56 +01:00
AC_CACHE_CHECK([whether clang gives bogus warnings for -Wdouble-promotion],
[lv_cv_clang_double_promotion_broken], [
save_CFLAGS="$CFLAGS"
CFLAGS="-O2 -Wdouble-promotion -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <math.h>
]], [[
float f = 0.0;
return isnan(f);]])],
[lv_cv_clang_double_promotion_broken=no],
[lv_cv_clang_double_promotion_broken=yes])
CFLAGS="$save_CFLAGS"])
if test "$lv_cv_clang_double_promotion_broken" = "yes";
then
dontwarn="$dontwarn -Wdouble-promotion"
fi
2019-10-01 10:52:28 +01:00
# Clang complains about unused static inline functions
# which are common with G_DEFINE_AUTOPTR_CLEANUP_FUNC
AC_CACHE_CHECK([whether clang gives bogus warnings for -Wunused-function],
[lv_cv_clang_unused_function_broken], [
save_CFLAGS="$CFLAGS"
CFLAGS="-Wunused-function -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
static inline void foo(void) {}
]], [[
return 0]])],
[lv_cv_clang_unused_function_broken=no],
[lv_cv_clang_unused_function_broken=yes])
CFLAGS="$save_CFLAGS"])
2012-03-27 16:47:11 +01:00
# 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 -Wpacked"
dontwarn="$dontwarn -Wunused-macros"
dontwarn="$dontwarn -Woverlength-strings"
dontwarn="$dontwarn -Wstack-protector"
2019-10-18 10:07:50 +02:00
dontwarn="$dontwarn -Wsuggest-attribute=malloc"
2012-03-27 16:47:11 +01:00
# 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])
2019-10-01 10:52:28 +01:00
# -Wunused-functin is implied by -Wall we must turn it
# off explicitly.
if test "$lv_cv_clang_unused_function_broken" = "yes";
then
wantwarn="$wantwarn -Wno-unused-function"
fi
2020-01-17 16:00:27 +00:00
# manywarnings uses '-W' (aka -Wextra) which includes a bunch of stuff.
2012-03-27 16:47:11 +01:00
# 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...
2013-08-15 15:04:45 -06:00
wantwarn="$wantwarn -Wno-sign-compare"
2018-02-13 16:40:19 +00:00
# We do "bad" function casts all the time for event callbacks
wantwarn="$wantwarn -Wno-cast-function-type"
2012-03-27 16:47:11 +01:00
2019-10-08 15:37:11 +01:00
# CLang incorrectly complains about dup typedefs win gnu99 mode
# so use this CLang-specific arg to keep it quiet
wantwarn="$wantwarn -Wno-typedef-redefinition"
2020-01-17 16:00:27 +00:00
# manywarnings expects this to be part of -Wc++-compat, but we turn
2012-03-27 16:47:11 +01:00
# that one off, so we need to manually enable this again
2013-08-15 15:04:45 -06:00
wantwarn="$wantwarn -Wjump-misses-init"
2012-03-27 16:47:11 +01:00
2020-01-17 16:00:27 +00:00
# manywarnings explicitly filters it out, preferring -Wswitch
2018-02-14 09:49:42 +00:00
# but that doesn't report missing enums if a default:
# is present.
wantwarn="$wantwarn -Wswitch-enum"
2020-01-17 16:00:27 +00:00
# manywarnings turns on -Wformat=2 which implies -Wformat-nonliteral,
2019-07-30 14:07:24 +01:00
# so we need to manually re-exclude it.
2013-08-15 15:04:45 -06:00
wantwarn="$wantwarn -Wno-format-nonliteral"
2012-03-27 16:47:11 +01:00
2017-06-15 14:22:54 +01:00
# -Wformat enables this by default, and we should keep it,
# but need to rewrite various areas of code first
wantwarn="$wantwarn -Wno-format-truncation"
2012-03-27 16:47:11 +01:00
# 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
2019-12-14 22:10:15 +01:00
wantwarn="$wantwarn -Wframe-larger-than=4096"
2019-12-14 22:26:26 +01:00
gl_WARN_ADD([-Wframe-larger-than=262144], [RELAXED_FRAME_LIMIT_CFLAGS])
2012-03-27 16:47:11 +01:00
# Extra special flags
dnl -fstack-protector stuff passes gl_WARN_ADD with gcc
dnl on Mingw32, but fails when actually used
case $host in
2014-01-01 13:42:49 +00:00
aarch64-*-*)
dnl "error: -fstack-protector not supported for this target [-Werror]"
;;
2013-05-15 19:41:49 +04:00
*-*-linux*)
2014-06-11 10:46:55 +02:00
dnl Prefer -fstack-protector-strong if it's available.
dnl There doesn't seem to be great overhead in adding
dnl -fstack-protector-all instead of -fstack-protector.
2014-06-11 10:44:26 +02:00
dnl
2014-06-11 10:46:55 +02:00
dnl We also don't need ssp-buffer-size with -all or -strong,
2014-06-11 10:44:26 +02:00
dnl since functions are protected regardless of buffer size.
dnl wantwarn="$wantwarn --param=ssp-buffer-size=4"
2014-06-11 10:46:55 +02:00
wantwarn="$wantwarn -fstack-protector-strong"
2012-03-27 16:47:11 +01:00
;;
2013-05-15 19:41:49 +04:00
*-*-freebsd*)
dnl FreeBSD ships old gcc 4.2.1 which doesn't handle
dnl -fstack-protector-all well
2013-08-15 15:04:45 -06:00
wantwarn="$wantwarn -fstack-protector"
2013-05-15 19:41:49 +04:00
2013-08-15 15:04:45 -06:00
wantwarn="$wantwarn -Wno-unused-command-line-argument"
2013-05-15 19:41:49 +04:00
;;
2007-03-01 16:18:55 +00:00
esac
2013-08-15 15:04:45 -06:00
wantwarn="$wantwarn -fexceptions"
wantwarn="$wantwarn -fasynchronous-unwind-tables"
2012-03-27 16:47:11 +01:00
# Need -fipa-pure-const in order to make -Wsuggest-attribute=pure
# fire even without -O.
2013-08-15 15:04:45 -06:00
wantwarn="$wantwarn -fipa-pure-const"
2012-03-27 16:47:11 +01:00
# We should eventually enable this, but right now there are at
# least 75 functions triggering warnings.
2013-08-15 15:04:45 -06:00
wantwarn="$wantwarn -Wno-suggest-attribute=pure"
wantwarn="$wantwarn -Wno-suggest-attribute=const"
2012-03-27 16:47:11 +01:00
2016-12-13 13:34:42 +01:00
if test "$enable_werror" = "yes"
2012-03-27 16:47:11 +01:00
then
2013-08-15 15:04:45 -06:00
wantwarn="$wantwarn -Werror"
2012-03-27 16:47:11 +01:00
fi
2007-03-21 14:52:12 +00:00
2019-10-07 14:07:28 +01:00
# Request the gnu99 standard which is the best choice with
# gcc 4.8.0. Not a warning flag, but the probing mechanism
# is convenient
2019-10-08 13:41:19 +01:00
wantwarn="$wantwarn -std=gnu99"
2019-10-07 14:07:28 +01:00
2013-08-15 15:04:45 -06:00
# Check for $CC support of each warning
for w in $wantwarn; do
gl_WARN_ADD([$w])
done
2014-06-11 10:46:55 +02:00
case $host in
*-*-linux*)
dnl Fall back to -fstack-protector-all if -strong is not available
case $WARN_CFLAGS in
*-fstack-protector-strong*)
;;
*)
2017-08-24 14:36:36 -05:00
gl_WARN_ADD([-fstack-protector-all])
2014-06-11 10:46:55 +02:00
;;
esac
;;
esac
2015-01-16 14:45:08 +00:00
case $WARN_CFLAGS in
*-Wsuggest-attribute=format*)
AC_DEFINE([HAVE_SUGGEST_ATTRIBUTE_FORMAT], [1], [Whether -Wsuggest-attribute=format works])
;;
esac
2020-01-17 16:00:27 +00:00
# Use security checked glibc headers
2013-08-15 15:04:45 -06:00
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
])
2016-04-10 18:22:20 +02:00
if test "$gl_cv_warn_c__Wlogical_op" = yes &&
test "$lv_cv_gcc_wlogical_op_equal_expr_broken" = yes; then
AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP_EQUAL_EXPR], 1,
[Define to 1 if gcc -Wlogical-op reports false positive 'or' equal expr])
fi
2007-03-01 16:18:55 +00:00
])