From 395d35c28d5c4dbd20bd5e4a64fc20a70d3d7a5d Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 26 Jul 2024 09:26:18 +0200 Subject: [PATCH v3 2/2] Add -Wmissing-variable-declarations to the standard compilation flags This warning flag detects global variables not declared in header files. This is similar to what -Wmissing-prototypes does for functions. (More correctly, it is similar to what -Wmissing-declarations does for functions, but -Wmissing-prototypes is a superset of that in C.) This flag is new in GCC 14. Clang has supported it for a while. Several recent commits have cleaned up warnings triggered by this, so it should now be clean. Reviewed-by: Andres Freund Discussion: https://www.postgresql.org/message-id/flat/e0a62134-83da-4ba4-8cdb-ceb0111c95ce@eisentraut.org --- configure | 49 +++++++++++++++++++++++ configure.ac | 9 +++++ meson.build | 10 +++++ src/Makefile.global.in | 1 + src/interfaces/ecpg/test/Makefile.regress | 2 +- src/interfaces/ecpg/test/meson.build | 1 + src/makefiles/meson.build | 2 + src/tools/pg_bsd_indent/Makefile | 2 + src/tools/pg_bsd_indent/meson.build | 1 + 9 files changed, 76 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 062d40e1ab2..c2b220e8cac 100755 --- a/configure +++ b/configure @@ -741,6 +741,7 @@ CXXFLAGS_SL_MODULE CFLAGS_SL_MODULE CFLAGS_VECTORIZE CFLAGS_UNROLL_LOOPS +PERMIT_MISSING_VARIABLE_DECLARATIONS PERMIT_DECLARATION_AFTER_STATEMENT LLVM_BINPATH LLVM_CXXFLAGS @@ -6080,6 +6081,54 @@ if test x"$pgac_cv_prog_CXX_cxxflags__Wformat_security" = x"yes"; then fi + # gcc 14+, clang for a while + # (Supported in C++ by clang but not gcc. For consistency, omit in C++.) + save_CFLAGS=$CFLAGS + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -Wmissing-variable-declarations, for CFLAGS" >&5 +$as_echo_n "checking whether ${CC} supports -Wmissing-variable-declarations, for CFLAGS... " >&6; } +if ${pgac_cv_prog_CC_cflags__Wmissing_variable_declarations+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CFLAGS=$CFLAGS +pgac_save_CC=$CC +CC=${CC} +CFLAGS="${CFLAGS} -Wmissing-variable-declarations" +ac_save_c_werror_flag=$ac_c_werror_flag +ac_c_werror_flag=yes +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + pgac_cv_prog_CC_cflags__Wmissing_variable_declarations=yes +else + pgac_cv_prog_CC_cflags__Wmissing_variable_declarations=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_c_werror_flag=$ac_save_c_werror_flag +CFLAGS="$pgac_save_CFLAGS" +CC="$pgac_save_CC" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__Wmissing_variable_declarations" >&5 +$as_echo "$pgac_cv_prog_CC_cflags__Wmissing_variable_declarations" >&6; } +if test x"$pgac_cv_prog_CC_cflags__Wmissing_variable_declarations" = x"yes"; then + CFLAGS="${CFLAGS} -Wmissing-variable-declarations" +fi + + + PERMIT_MISSING_VARIABLE_DECLARATIONS= + if test x"$save_CFLAGS" != x"$CFLAGS"; then + PERMIT_MISSING_VARIABLE_DECLARATIONS=-Wno-missing-variable-declarations + fi + # Disable strict-aliasing rules; needed for gcc 3.3+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -fno-strict-aliasing, for CFLAGS" >&5 diff --git a/configure.ac b/configure.ac index ef56226156a..48917718240 100644 --- a/configure.ac +++ b/configure.ac @@ -530,6 +530,15 @@ if test "$GCC" = yes -a "$ICC" = no; then # This was included in -Wall/-Wformat in older GCC versions PGAC_PROG_CC_CFLAGS_OPT([-Wformat-security]) PGAC_PROG_CXX_CFLAGS_OPT([-Wformat-security]) + # gcc 14+, clang for a while + # (Supported in C++ by clang but not gcc. For consistency, omit in C++.) + save_CFLAGS=$CFLAGS + PGAC_PROG_CC_CFLAGS_OPT([-Wmissing-variable-declarations]) + PERMIT_MISSING_VARIABLE_DECLARATIONS= + if test x"$save_CFLAGS" != x"$CFLAGS"; then + PERMIT_MISSING_VARIABLE_DECLARATIONS=-Wno-missing-variable-declarations + fi + AC_SUBST(PERMIT_MISSING_VARIABLE_DECLARATIONS) # Disable strict-aliasing rules; needed for gcc 3.3+ PGAC_PROG_CC_CFLAGS_OPT([-fno-strict-aliasing]) PGAC_PROG_CXX_CFLAGS_OPT([-fno-strict-aliasing]) diff --git a/meson.build b/meson.build index efde3a28cc9..733f8be47f7 100644 --- a/meson.build +++ b/meson.build @@ -1971,6 +1971,16 @@ if cc.has_argument('-Wdeclaration-after-statement') cflags_no_decl_after_statement += '-Wno-declaration-after-statement' endif +# Some code is not clean for -Wmissing-variable-declarations, so we +# make the "no" option available. Also, while clang supports this +# option for C++, gcc does not, so for consistency, leave it off for +# C++. +cflags_no_missing_var_decls = [] +if cc.has_argument('-Wmissing-variable-declarations') + cflags_warn += '-Wmissing-variable-declarations' + cflags_no_missing_var_decls += '-Wno-missing-variable-declarations' +endif + # The following tests want to suppress various unhelpful warnings by adding # -Wno-foo switches. But gcc won't complain about unrecognized -Wno-foo diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 83b91fe9167..42f50b49761 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -266,6 +266,7 @@ CFLAGS_POPCNT = @CFLAGS_POPCNT@ CFLAGS_CRC = @CFLAGS_CRC@ CFLAGS_XSAVE = @CFLAGS_XSAVE@ PERMIT_DECLARATION_AFTER_STATEMENT = @PERMIT_DECLARATION_AFTER_STATEMENT@ +PERMIT_MISSING_VARIABLE_DECLARATIONS = @PERMIT_MISSING_VARIABLE_DECLARATIONS@ CXXFLAGS = @CXXFLAGS@ LLVM_CPPFLAGS = @LLVM_CPPFLAGS@ diff --git a/src/interfaces/ecpg/test/Makefile.regress b/src/interfaces/ecpg/test/Makefile.regress index b0647cd2c5f..9bf0efa40b9 100644 --- a/src/interfaces/ecpg/test/Makefile.regress +++ b/src/interfaces/ecpg/test/Makefile.regress @@ -3,7 +3,7 @@ override CPPFLAGS := -I../../include -I$(top_srcdir)/src/interfaces/ecpg/include \ -I$(libpq_srcdir) $(CPPFLAGS) -override CFLAGS += $(PTHREAD_CFLAGS) +override CFLAGS += $(PTHREAD_CFLAGS) $(PERMIT_MISSING_VARIABLE_DECLARATIONS) LDFLAGS_INTERNAL += -L../../ecpglib -lecpg -L../../pgtypeslib -lpgtypes $(libpq) diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build index c1e508ccc82..8fd284071f2 100644 --- a/src/interfaces/ecpg/test/meson.build +++ b/src/interfaces/ecpg/test/meson.build @@ -27,6 +27,7 @@ testprep_targets += pg_regress_ecpg # create .c files and executables from .pgc files ecpg_test_exec_kw = { + 'c_args': cflags_no_missing_var_decls, 'dependencies': [frontend_code, libpq], 'include_directories': [ecpg_inc], 'link_with': [ecpglib_so, ecpg_compat_so, ecpg_pgtypes_so], diff --git a/src/makefiles/meson.build b/src/makefiles/meson.build index 5618050b306..850e9275845 100644 --- a/src/makefiles/meson.build +++ b/src/makefiles/meson.build @@ -98,6 +98,8 @@ pgxs_kv = { 'CXXFLAGS_SL_MODULE': ' '.join(cxxflags_mod), 'PERMIT_DECLARATION_AFTER_STATEMENT': ' '.join(cflags_no_decl_after_statement), + 'PERMIT_MISSING_VARIABLE_DECLARATIONS': + ' '.join(cflags_no_missing_var_decls), 'CFLAGS_CRC': ' '.join(cflags_crc), 'CFLAGS_POPCNT': ' '.join(cflags_popcnt), diff --git a/src/tools/pg_bsd_indent/Makefile b/src/tools/pg_bsd_indent/Makefile index d922013e40b..f721dfb0d19 100644 --- a/src/tools/pg_bsd_indent/Makefile +++ b/src/tools/pg_bsd_indent/Makefile @@ -25,6 +25,8 @@ OBJS = \ parse.o \ pr_comment.o +$(OBJS): CFLAGS += $(PERMIT_MISSING_VARIABLE_DECLARATIONS) + all: pg_bsd_indent pg_bsd_indent: $(OBJS) | submake-libpgport diff --git a/src/tools/pg_bsd_indent/meson.build b/src/tools/pg_bsd_indent/meson.build index 4387c47740e..87ed4292975 100644 --- a/src/tools/pg_bsd_indent/meson.build +++ b/src/tools/pg_bsd_indent/meson.build @@ -18,6 +18,7 @@ endif pg_bsd_indent = executable('pg_bsd_indent', pg_bsd_indent_sources, + c_args: cflags_no_missing_var_decls, dependencies: [frontend_code], include_directories: include_directories('.'), kwargs: default_bin_args + { -- 2.45.2