2007-03-01 16:18:55 +00:00
|
|
|
dnl
|
2010-07-16 15:04:05 +00: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 12:34:42 +00: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 15:47:11 +00: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"
|
|
|
|
# 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"
|
2012-07-25 07:43:37 +00:00
|
|
|
# Gnulib's stat-time.h violates this
|
|
|
|
dontwarn="$dontwarn -Waggregate-return"
|
2012-09-07 17:42:10 +00:00
|
|
|
# gcc 4.4.6 complains this is C++ only; gcc 4.7.0 implies this from -Wall
|
|
|
|
dontwarn="$dontwarn -Wenum-compare"
|
2015-05-26 03:33:24 +00:00
|
|
|
# gcc 5.1 -Wformat-signedness mishandles enums, not ready for prime time
|
|
|
|
dontwarn="$dontwarn -Wformat-signedness"
|
2017-06-14 14:10:02 +00:00
|
|
|
# Several conditionals expand the same on both branches
|
|
|
|
# depending on the particular platform/architecture
|
|
|
|
dontwarn="$dontwarn -Wduplicated-branches"
|
2012-03-27 15:47:11 +00:00
|
|
|
|
2012-10-02 14:37:00 +00:00
|
|
|
# gcc 4.2 treats attribute(format) as an implicit attribute(nonnull),
|
|
|
|
# which triggers spurious warnings for our usage
|
2013-08-07 15:44:52 +00:00
|
|
|
AC_CACHE_CHECK([whether the C compiler's -Wformat allows NULL strings],
|
2012-10-02 14:37:00 +00:00
|
|
|
[lv_cv_gcc_wformat_null_works], [
|
|
|
|
save_CFLAGS=$CFLAGS
|
|
|
|
CFLAGS='-Wunknown-pragmas -Werror -Wformat'
|
|
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|
|
|
#include <stddef.h>
|
|
|
|
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])
|
|
|
|
|
2012-08-14 20:11:35 +00:00
|
|
|
# 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"
|
2013-04-03 14:52:40 +00:00
|
|
|
dontwarn="$dontwarn -Wcast-align"
|
2013-05-13 11:41:07 +00:00
|
|
|
else
|
|
|
|
AC_DEFINE_UNQUOTED([WORKING_PRAGMA_PUSH], 1,
|
|
|
|
[Define to 1 if gcc supports pragma push/pop])
|
2012-08-14 20:11:35 +00:00
|
|
|
fi
|
|
|
|
|
2012-12-19 19:07:39 +00:00
|
|
|
dnl Check whether strchr(s, char variable) causes a bogus compile
|
|
|
|
dnl warning, which is the case with GCC < 4.6 on some glibc
|
2013-08-07 15:44:52 +00:00
|
|
|
AC_CACHE_CHECK([whether the C compiler's -Wlogical-op gives bogus warnings],
|
2012-12-19 19:07:39 +00:00
|
|
|
[lv_cv_gcc_wlogical_op_broken], [
|
|
|
|
save_CFLAGS="$CFLAGS"
|
|
|
|
CFLAGS="-O2 -Wlogical-op -Werror"
|
|
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|
|
|
#include <string.h>
|
|
|
|
]], [[
|
|
|
|
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"])
|
|
|
|
|
2016-04-10 16:22:20 +00: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 16:23:56 +00: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
|
|
|
|
|
2012-03-27 15:47:11 +00: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"
|
|
|
|
|
|
|
|
# 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...
|
2013-08-15 21:04:45 +00:00
|
|
|
wantwarn="$wantwarn -Wno-sign-compare"
|
2012-03-27 15:47:11 +00:00
|
|
|
|
|
|
|
# GNULIB expects this to be part of -Wc++-compat, but we turn
|
|
|
|
# that one off, so we need to manually enable this again
|
2013-08-15 21:04:45 +00:00
|
|
|
wantwarn="$wantwarn -Wjump-misses-init"
|
2012-03-27 15:47:11 +00:00
|
|
|
|
|
|
|
# GNULIB turns on -Wformat=2 which implies -Wformat-nonliteral,
|
build: avoid warnings from gcc 4.2.1
OpenBSD ships with gcc 4.2.1, which annoyingly treats all format
strings as though they were also attribute((nonnull)). The two
concepts are orthogonal, though, as evidenced by the number of
spurious warnings it generates on uses where we know that
virReportError specifically handles NULL instead of a format
string; worse, since we now force -Werror on git builds, it
prevents development builds on OpenBSD.
I hate to do this, as it disables ALL format checking on older
gcc, and therefore misses out on some useful checks (code that
happened to compile on Linux may still have type mismatches
when compiled on other platforms, as evidenced by the number
of times I have fixed formatting mismatches for uid_t as found
by warnings on Cygwin), but I don't see any other way to keep
-Werror alive and still compile on OpenBSD.
A more invasive change would be to make virReportError() mark
its format attribute as nonnull, and fix (a lot of) fallout;
we may end up doing that anyways as part of danpb's error
refactoring improvements, but not today.
* src/internal.h (ATTRIBUTE_FMT_PRINTF): Use preferred spellings.
* m4/virt-compile-warnings.m4 (-Wformat): Disable on older gcc.
2012-09-05 17:40:31 +00:00
|
|
|
# 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).
|
2013-08-15 21:04:45 +00:00
|
|
|
wantwarn="$wantwarn -Wno-format-nonliteral"
|
2012-10-02 14:37:00 +00:00
|
|
|
if test $lv_cv_gcc_wformat_null_works = no; then
|
2013-08-15 21:04:45 +00:00
|
|
|
wantwarn="$wantwarn -Wno-format"
|
build: avoid warnings from gcc 4.2.1
OpenBSD ships with gcc 4.2.1, which annoyingly treats all format
strings as though they were also attribute((nonnull)). The two
concepts are orthogonal, though, as evidenced by the number of
spurious warnings it generates on uses where we know that
virReportError specifically handles NULL instead of a format
string; worse, since we now force -Werror on git builds, it
prevents development builds on OpenBSD.
I hate to do this, as it disables ALL format checking on older
gcc, and therefore misses out on some useful checks (code that
happened to compile on Linux may still have type mismatches
when compiled on other platforms, as evidenced by the number
of times I have fixed formatting mismatches for uid_t as found
by warnings on Cygwin), but I don't see any other way to keep
-Werror alive and still compile on OpenBSD.
A more invasive change would be to make virReportError() mark
its format attribute as nonnull, and fix (a lot of) fallout;
we may end up doing that anyways as part of danpb's error
refactoring improvements, but not today.
* src/internal.h (ATTRIBUTE_FMT_PRINTF): Use preferred spellings.
* m4/virt-compile-warnings.m4 (-Wformat): Disable on older gcc.
2012-09-05 17:40:31 +00:00
|
|
|
fi
|
2012-03-27 15:47:11 +00:00
|
|
|
|
2017-06-15 13:22:54 +00: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 15:47:11 +00: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
|
2017-08-24 19:36:36 +00:00
|
|
|
gl_WARN_ADD([-Wframe-larger-than=4096], [STRICT_FRAME_LIMIT_CFLAGS])
|
|
|
|
gl_WARN_ADD([-Wframe-larger-than=25600], [RELAXED_FRAME_LIMIT_CFLAGS])
|
2012-03-27 15:47:11 +00: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 15:41:49 +00:00
|
|
|
*-*-linux*)
|
2014-06-11 08:46:55 +00: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 08:44:26 +00:00
|
|
|
dnl
|
2014-06-11 08:46:55 +00:00
|
|
|
dnl We also don't need ssp-buffer-size with -all or -strong,
|
2014-06-11 08:44:26 +00:00
|
|
|
dnl since functions are protected regardless of buffer size.
|
|
|
|
dnl wantwarn="$wantwarn --param=ssp-buffer-size=4"
|
2014-06-11 08:46:55 +00:00
|
|
|
wantwarn="$wantwarn -fstack-protector-strong"
|
2012-03-27 15:47:11 +00:00
|
|
|
;;
|
2013-05-15 15:41:49 +00:00
|
|
|
*-*-freebsd*)
|
|
|
|
dnl FreeBSD ships old gcc 4.2.1 which doesn't handle
|
|
|
|
dnl -fstack-protector-all well
|
2013-08-15 21:04:45 +00:00
|
|
|
wantwarn="$wantwarn -fstack-protector"
|
2013-05-15 15:41:49 +00:00
|
|
|
|
2013-08-15 21:04:45 +00:00
|
|
|
wantwarn="$wantwarn -Wno-unused-command-line-argument"
|
2013-05-15 15:41:49 +00:00
|
|
|
;;
|
2007-03-01 16:18:55 +00:00
|
|
|
esac
|
2013-08-15 21:04:45 +00:00
|
|
|
wantwarn="$wantwarn -fexceptions"
|
|
|
|
wantwarn="$wantwarn -fasynchronous-unwind-tables"
|
2012-03-27 15:47:11 +00:00
|
|
|
|
|
|
|
# Need -fipa-pure-const in order to make -Wsuggest-attribute=pure
|
|
|
|
# fire even without -O.
|
2013-08-15 21:04:45 +00:00
|
|
|
wantwarn="$wantwarn -fipa-pure-const"
|
2012-03-27 15:47:11 +00:00
|
|
|
# We should eventually enable this, but right now there are at
|
|
|
|
# least 75 functions triggering warnings.
|
2013-08-15 21:04:45 +00:00
|
|
|
wantwarn="$wantwarn -Wno-suggest-attribute=pure"
|
|
|
|
wantwarn="$wantwarn -Wno-suggest-attribute=const"
|
2012-03-27 15:47:11 +00:00
|
|
|
|
2016-12-13 12:34:42 +00:00
|
|
|
if test "$enable_werror" = "yes"
|
2012-03-27 15:47:11 +00:00
|
|
|
then
|
2013-08-15 21:04:45 +00:00
|
|
|
wantwarn="$wantwarn -Werror"
|
2012-03-27 15:47:11 +00:00
|
|
|
fi
|
2007-03-21 14:52:12 +00:00
|
|
|
|
2013-08-15 21:04:45 +00:00
|
|
|
# Check for $CC support of each warning
|
|
|
|
for w in $wantwarn; do
|
|
|
|
gl_WARN_ADD([$w])
|
|
|
|
done
|
|
|
|
|
2014-06-11 08:46:55 +00: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 19:36:36 +00:00
|
|
|
gl_WARN_ADD([-fstack-protector-all])
|
2014-06-11 08:46:55 +00: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
|
|
|
|
|
2013-08-15 21:04:45 +00:00
|
|
|
# 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
|
|
|
|
])
|
|
|
|
|
2012-12-19 19:07:39 +00:00
|
|
|
if test "$gl_cv_warn_c__Wlogical_op" = yes &&
|
|
|
|
test "$lv_cv_gcc_wlogical_op_broken" = yes; then
|
2016-04-10 16:21:13 +00:00
|
|
|
AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP_STRCHR], 1,
|
2012-12-19 19:07:39 +00:00
|
|
|
[Define to 1 if gcc -Wlogical-op reports false positives on strchr])
|
|
|
|
fi
|
2016-04-10 16:22:20 +00: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
|
|
|
])
|