1b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0 2a86fe353SMasahiro Yamada# ========================================================================== 3a86fe353SMasahiro Yamada# make W=... settings 4a86fe353SMasahiro Yamada# 5c77d06e7SYann Droneaud# There are four warning groups enabled by W=1, W=2, W=3, and W=e 6c77d06e7SYann Droneaud# They are independent, and can be combined like W=12 or W=123e. 7a86fe353SMasahiro Yamada# ========================================================================== 8a86fe353SMasahiro Yamada 9*e88ca243SArnd Bergmann# Default set of warnings, always enabled 10*e88ca243SArnd BergmannKBUILD_CFLAGS += -Wall 11*e88ca243SArnd BergmannKBUILD_CFLAGS += -Wundef 12*e88ca243SArnd BergmannKBUILD_CFLAGS += -Werror=implicit-function-declaration 13*e88ca243SArnd BergmannKBUILD_CFLAGS += -Werror=implicit-int 14*e88ca243SArnd BergmannKBUILD_CFLAGS += -Werror=return-type 15*e88ca243SArnd BergmannKBUILD_CFLAGS += -Werror=strict-prototypes 16*e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-format-security 17*e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-trigraphs 18*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning,frame-address,) 19*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, format-truncation) 20*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, format-overflow) 21*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member) 22*e88ca243SArnd Bergmann 23*e88ca243SArnd Bergmannifneq ($(CONFIG_FRAME_WARN),0) 24*e88ca243SArnd BergmannKBUILD_CFLAGS += -Wframe-larger-than=$(CONFIG_FRAME_WARN) 25*e88ca243SArnd Bergmannendif 26*e88ca243SArnd Bergmann 27*e88ca243SArnd BergmannKBUILD_CPPFLAGS-$(CONFIG_WERROR) += -Werror 28*e88ca243SArnd BergmannKBUILD_CPPFLAGS += $(KBUILD_CPPFLAGS-y) 29*e88ca243SArnd BergmannKBUILD_CFLAGS-$(CONFIG_CC_NO_ARRAY_BOUNDS) += -Wno-array-bounds 30*e88ca243SArnd Bergmann 31*e88ca243SArnd Bergmannifdef CONFIG_CC_IS_CLANG 32*e88ca243SArnd Bergmann# The kernel builds with '-std=gnu11' so use of GNU extensions is acceptable. 33*e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-gnu 34*e88ca243SArnd Bergmannelse 35*e88ca243SArnd Bergmann 36*e88ca243SArnd Bergmann# gcc inanely warns about local variables called 'main' 37*e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-main 38*e88ca243SArnd Bergmannendif 39*e88ca243SArnd Bergmann 40*e88ca243SArnd Bergmann# These warnings generated too much noise in a regular build. 41*e88ca243SArnd Bergmann# Use make W=1 to enable them (see scripts/Makefile.extrawarn) 42*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable) 43*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable) 44*e88ca243SArnd Bergmann 45*e88ca243SArnd Bergmann# These result in bogus false positives 46*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, dangling-pointer) 47*e88ca243SArnd Bergmann 48*e88ca243SArnd Bergmann# Variable Length Arrays (VLAs) should not be used anywhere in the kernel 49*e88ca243SArnd BergmannKBUILD_CFLAGS += -Wvla 50*e88ca243SArnd Bergmann 51*e88ca243SArnd Bergmann# disable pointer signed / unsigned warnings in gcc 4.0 52*e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-pointer-sign 53*e88ca243SArnd Bergmann 54*e88ca243SArnd Bergmann# In order to make sure new function cast mismatches are not introduced 55*e88ca243SArnd Bergmann# in the kernel (to avoid tripping CFI checking), the kernel should be 56*e88ca243SArnd Bergmann# globally built with -Wcast-function-type. 57*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-option, -Wcast-function-type) 58*e88ca243SArnd Bergmann 59*e88ca243SArnd Bergmann# disable stringop warnings in gcc 8+ 60*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, stringop-truncation) 61*e88ca243SArnd Bergmann 62*e88ca243SArnd Bergmann# We'll want to enable this eventually, but it's not going away for 5.7 at least 63*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, stringop-overflow) 64*e88ca243SArnd Bergmann 65*e88ca243SArnd Bergmann# Another good warning that we'll want to enable eventually 66*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, restrict) 67*e88ca243SArnd Bergmann 68*e88ca243SArnd Bergmann# Enabled with W=2, disabled by default as noisy 69*e88ca243SArnd Bergmannifdef CONFIG_CC_IS_GCC 70*e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-maybe-uninitialized 71*e88ca243SArnd Bergmannendif 72*e88ca243SArnd Bergmann 73*e88ca243SArnd Bergmann# The allocators already balk at large sizes, so silence the compiler 74*e88ca243SArnd Bergmann# warnings for bounds checks involving those possible values. While 75*e88ca243SArnd Bergmann# -Wno-alloc-size-larger-than would normally be used here, earlier versions 76*e88ca243SArnd Bergmann# of gcc (<9.1) weirdly don't handle the option correctly when _other_ 77*e88ca243SArnd Bergmann# warnings are produced (?!). Using -Walloc-size-larger-than=SIZE_MAX 78*e88ca243SArnd Bergmann# doesn't work (as it is documented to), silently resolving to "0" prior to 79*e88ca243SArnd Bergmann# version 9.1 (and producing an error more recently). Numeric values larger 80*e88ca243SArnd Bergmann# than PTRDIFF_MAX also don't work prior to version 9.1, which are silently 81*e88ca243SArnd Bergmann# ignored, continuing to default to PTRDIFF_MAX. So, left with no other 82*e88ca243SArnd Bergmann# choice, we must perform a versioned check to disable this warning. 83*e88ca243SArnd Bergmann# https://lore.kernel.org/lkml/[email protected] 84*e88ca243SArnd BergmannKBUILD_CFLAGS-$(call gcc-min-version, 90100) += -Wno-alloc-size-larger-than 85*e88ca243SArnd BergmannKBUILD_CFLAGS += $(KBUILD_CFLAGS-y) $(CONFIG_CC_IMPLICIT_FALLTHROUGH) 86*e88ca243SArnd Bergmann 87*e88ca243SArnd Bergmann# Prohibit date/time macros, which would make the build non-deterministic 88*e88ca243SArnd BergmannKBUILD_CFLAGS += -Werror=date-time 89*e88ca243SArnd Bergmann 90*e88ca243SArnd Bergmann# enforce correct pointer usage 91*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-option,-Werror=incompatible-pointer-types) 92*e88ca243SArnd Bergmann 93*e88ca243SArnd Bergmann# Require designated initializers for all marked structures 94*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-option,-Werror=designated-init) 95*e88ca243SArnd Bergmann 96*e88ca243SArnd Bergmann# Warn if there is an enum types mismatch 97*e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-option,-Wenum-conversion) 98*e88ca243SArnd Bergmann 99321cb030SXiongfeng WangKBUILD_CFLAGS += $(call cc-disable-warning, packed-not-aligned) 100321cb030SXiongfeng Wang 101e27128dbSMasahiro Yamada# backward compatibility 102e27128dbSMasahiro YamadaKBUILD_EXTRA_WARN ?= $(KBUILD_ENABLE_EXTRA_GCC_CHECKS) 103e27128dbSMasahiro Yamada 104a86fe353SMasahiro Yamadaifeq ("$(origin W)", "command line") 105e27128dbSMasahiro Yamada KBUILD_EXTRA_WARN := $(W) 106a86fe353SMasahiro Yamadaendif 107a86fe353SMasahiro Yamada 108e27128dbSMasahiro Yamadaexport KBUILD_EXTRA_WARN 109e27128dbSMasahiro Yamada 11064a91907SMasahiro Yamada# 11164a91907SMasahiro Yamada# W=1 - warnings which may be relevant and do not occur too often 11264a91907SMasahiro Yamada# 113e27128dbSMasahiro Yamadaifneq ($(findstring 1, $(KBUILD_EXTRA_WARN)),) 114a86fe353SMasahiro Yamada 11564a91907SMasahiro YamadaKBUILD_CFLAGS += -Wextra -Wunused -Wno-unused-parameter 11664a91907SMasahiro YamadaKBUILD_CFLAGS += -Wmissing-declarations 11764a91907SMasahiro YamadaKBUILD_CFLAGS += -Wmissing-format-attribute 11864a91907SMasahiro YamadaKBUILD_CFLAGS += -Wmissing-prototypes 11964a91907SMasahiro YamadaKBUILD_CFLAGS += -Wold-style-definition 12064a91907SMasahiro YamadaKBUILD_CFLAGS += -Wmissing-include-dirs 12164a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wunused-but-set-variable) 12264a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wunused-const-variable) 12364a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wpacked-not-aligned) 12464a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wstringop-truncation) 1254c8dd95aSMasahiro Yamada# The following turn off the warnings enabled by -Wextra 12664a91907SMasahiro YamadaKBUILD_CFLAGS += -Wno-missing-field-initializers 12764a91907SMasahiro YamadaKBUILD_CFLAGS += -Wno-sign-compare 128355a3587SRikard FalkebornKBUILD_CFLAGS += -Wno-type-limits 1291344794aSArnd BergmannKBUILD_CFLAGS += -Wno-shift-negative-value 130a86fe353SMasahiro Yamada 13180b6093bSMasahiro YamadaKBUILD_CPPFLAGS += -Wundef 1326863f564SMasahiro YamadaKBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN1 1336863f564SMasahiro Yamada 13426ea6bb1SBehan Websterelse 13526ea6bb1SBehan Webster 13664a91907SMasahiro Yamada# Some diagnostics enabled by default are noisy. 13764a91907SMasahiro Yamada# Suppress them by using -Wno... except for W=1. 13864a91907SMasahiro Yamada 139076f421dSMasahiro Yamadaifdef CONFIG_CC_IS_CLANG 140a1494304SMasahiro YamadaKBUILD_CFLAGS += -Wno-initializer-overrides 141b0839b28SNick Desaulniers# Clang before clang-16 would warn on default argument promotions. 14288b61e3bSNick Desaulniersifneq ($(call clang-min-version, 160000),y) 143b0839b28SNick Desaulniers# Disable -Wformat 14421f9c8a1SLinus TorvaldsKBUILD_CFLAGS += -Wno-format 145b0839b28SNick Desaulniers# Then re-enable flags that were part of the -Wformat group that aren't 146b0839b28SNick Desaulniers# problematic. 147b0839b28SNick DesaulniersKBUILD_CFLAGS += -Wformat-extra-args -Wformat-invalid-specifier 148b0839b28SNick DesaulniersKBUILD_CFLAGS += -Wformat-zero-length -Wnonnull 149b0839b28SNick Desaulniers# Requires clang-12+. 15088b61e3bSNick Desaulniersifeq ($(call clang-min-version, 120000),y) 151b0839b28SNick DesaulniersKBUILD_CFLAGS += -Wformat-insufficient-args 152b0839b28SNick Desaulniersendif 153b0839b28SNick Desaulniersendif 154a1494304SMasahiro YamadaKBUILD_CFLAGS += -Wno-sign-compare 15582f2bc2fSNathan ChancellorKBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) 156afe956c5SNathan ChancellorKBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare 1571cf5f151SNathan ChancellorKBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) 15821206351SSami TolvanenKBUILD_CFLAGS += $(call cc-disable-warning, cast-function-type-strict) 15926ea6bb1SBehan Websterendif 16064a91907SMasahiro Yamada 16164a91907SMasahiro Yamadaendif 16264a91907SMasahiro Yamada 16364a91907SMasahiro Yamada# 16464a91907SMasahiro Yamada# W=2 - warnings which occur quite often but may still be relevant 16564a91907SMasahiro Yamada# 166e27128dbSMasahiro Yamadaifneq ($(findstring 2, $(KBUILD_EXTRA_WARN)),) 16764a91907SMasahiro Yamada 16864a91907SMasahiro YamadaKBUILD_CFLAGS += -Wdisabled-optimization 16964a91907SMasahiro YamadaKBUILD_CFLAGS += -Wshadow 17064a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wlogical-op) 17164a91907SMasahiro YamadaKBUILD_CFLAGS += -Wmissing-field-initializers 172355a3587SRikard FalkebornKBUILD_CFLAGS += -Wtype-limits 17364a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wmaybe-uninitialized) 17464a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wunused-macros) 17564a91907SMasahiro Yamada 1766863f564SMasahiro YamadaKBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN2 1776863f564SMasahiro Yamada 17864a91907SMasahiro Yamadaendif 17964a91907SMasahiro Yamada 18064a91907SMasahiro Yamada# 18164a91907SMasahiro Yamada# W=3 - more obscure warnings, can most likely be ignored 18264a91907SMasahiro Yamada# 183e27128dbSMasahiro Yamadaifneq ($(findstring 3, $(KBUILD_EXTRA_WARN)),) 18464a91907SMasahiro Yamada 18564a91907SMasahiro YamadaKBUILD_CFLAGS += -Wbad-function-cast 186095fbca0SArnd BergmannKBUILD_CFLAGS += -Wcast-align 18764a91907SMasahiro YamadaKBUILD_CFLAGS += -Wcast-qual 18864a91907SMasahiro YamadaKBUILD_CFLAGS += -Wconversion 18964a91907SMasahiro YamadaKBUILD_CFLAGS += -Wpacked 19064a91907SMasahiro YamadaKBUILD_CFLAGS += -Wpadded 19164a91907SMasahiro YamadaKBUILD_CFLAGS += -Wpointer-arith 19264a91907SMasahiro YamadaKBUILD_CFLAGS += -Wredundant-decls 193a97ea93eSJoe PerchesKBUILD_CFLAGS += -Wsign-compare 19464a91907SMasahiro YamadaKBUILD_CFLAGS += -Wswitch-default 19564a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wpacked-bitfield-compat) 19664a91907SMasahiro Yamada 1976863f564SMasahiro YamadaKBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3 1986863f564SMasahiro Yamada 199a86fe353SMasahiro Yamadaendif 200c77d06e7SYann Droneaud 201c77d06e7SYann Droneaud# 202c77d06e7SYann Droneaud# W=e - error out on warnings 203c77d06e7SYann Droneaud# 204c77d06e7SYann Droneaudifneq ($(findstring e, $(KBUILD_EXTRA_WARN)),) 205c77d06e7SYann Droneaud 206c77d06e7SYann DroneaudKBUILD_CFLAGS += -Werror 207c77d06e7SYann Droneaud 208c77d06e7SYann Droneaudendif 209