xref: /linux-6.15/scripts/Makefile.extrawarn (revision e88ca243)
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