xref: /openbmc/linux/scripts/Makefile.extrawarn (revision 44ad3baf1cca483e418b6aadf2d3994f69e0f16a)
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
9e88ca243SArnd Bergmann# Default set of warnings, always enabled
10e88ca243SArnd BergmannKBUILD_CFLAGS += -Wall
11e88ca243SArnd BergmannKBUILD_CFLAGS += -Wundef
12e88ca243SArnd BergmannKBUILD_CFLAGS += -Werror=implicit-function-declaration
13e88ca243SArnd BergmannKBUILD_CFLAGS += -Werror=implicit-int
14e88ca243SArnd BergmannKBUILD_CFLAGS += -Werror=return-type
15e88ca243SArnd BergmannKBUILD_CFLAGS += -Werror=strict-prototypes
16e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-format-security
17e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-trigraphs
18e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
19e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
20e88ca243SArnd Bergmann
21e88ca243SArnd Bergmannifneq ($(CONFIG_FRAME_WARN),0)
22e88ca243SArnd BergmannKBUILD_CFLAGS += -Wframe-larger-than=$(CONFIG_FRAME_WARN)
23e88ca243SArnd Bergmannendif
24e88ca243SArnd Bergmann
25e88ca243SArnd BergmannKBUILD_CPPFLAGS-$(CONFIG_WERROR) += -Werror
26e88ca243SArnd BergmannKBUILD_CPPFLAGS += $(KBUILD_CPPFLAGS-y)
27e88ca243SArnd BergmannKBUILD_CFLAGS-$(CONFIG_CC_NO_ARRAY_BOUNDS) += -Wno-array-bounds
28e88ca243SArnd Bergmann
29e88ca243SArnd Bergmannifdef CONFIG_CC_IS_CLANG
30e88ca243SArnd Bergmann# The kernel builds with '-std=gnu11' so use of GNU extensions is acceptable.
31e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-gnu
32*b0630d18SNathan Chancellor
33*b0630d18SNathan Chancellor# Clang may emit a warning when a const variable, such as the dummy variables
34*b0630d18SNathan Chancellor# in typecheck(), or const member of an aggregate type are not initialized,
35*b0630d18SNathan Chancellor# which can result in unexpected behavior. However, in many audited cases of
36*b0630d18SNathan Chancellor# the "field" variant of the warning, this is intentional because the field is
37*b0630d18SNathan Chancellor# never used within a particular call path, the field is within a union with
38*b0630d18SNathan Chancellor# other non-const members, or the containing object is not const so the field
39*b0630d18SNathan Chancellor# can be modified via memcpy() / memset(). While the variable warning also gets
40*b0630d18SNathan Chancellor# disabled with this same switch, there should not be too much coverage lost
41*b0630d18SNathan Chancellor# because -Wuninitialized will still flag when an uninitialized const variable
42*b0630d18SNathan Chancellor# is used.
43*b0630d18SNathan ChancellorKBUILD_CFLAGS += $(call cc-disable-warning, default-const-init-unsafe)
44e88ca243SArnd Bergmannelse
45e88ca243SArnd Bergmann
46e88ca243SArnd Bergmann# gcc inanely warns about local variables called 'main'
47e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-main
48e88ca243SArnd Bergmannendif
49e88ca243SArnd Bergmann
50e88ca243SArnd Bergmann# These warnings generated too much noise in a regular build.
51e88ca243SArnd Bergmann# Use make W=1 to enable them (see scripts/Makefile.extrawarn)
52e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
53e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
54e88ca243SArnd Bergmann
55e88ca243SArnd Bergmann# These result in bogus false positives
56e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, dangling-pointer)
57e88ca243SArnd Bergmann
58e88ca243SArnd Bergmann# Variable Length Arrays (VLAs) should not be used anywhere in the kernel
59e88ca243SArnd BergmannKBUILD_CFLAGS += -Wvla
60e88ca243SArnd Bergmann
61e88ca243SArnd Bergmann# disable pointer signed / unsigned warnings in gcc 4.0
62e88ca243SArnd BergmannKBUILD_CFLAGS += -Wno-pointer-sign
63e88ca243SArnd Bergmann
64e88ca243SArnd Bergmann# In order to make sure new function cast mismatches are not introduced
65e88ca243SArnd Bergmann# in the kernel (to avoid tripping CFI checking), the kernel should be
66e88ca243SArnd Bergmann# globally built with -Wcast-function-type.
67e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-option, -Wcast-function-type)
68e88ca243SArnd Bergmann
69e88ca243SArnd Bergmann# The allocators already balk at large sizes, so silence the compiler
70e88ca243SArnd Bergmann# warnings for bounds checks involving those possible values. While
71e88ca243SArnd Bergmann# -Wno-alloc-size-larger-than would normally be used here, earlier versions
72e88ca243SArnd Bergmann# of gcc (<9.1) weirdly don't handle the option correctly when _other_
73e88ca243SArnd Bergmann# warnings are produced (?!). Using -Walloc-size-larger-than=SIZE_MAX
74e88ca243SArnd Bergmann# doesn't work (as it is documented to), silently resolving to "0" prior to
75e88ca243SArnd Bergmann# version 9.1 (and producing an error more recently). Numeric values larger
76e88ca243SArnd Bergmann# than PTRDIFF_MAX also don't work prior to version 9.1, which are silently
77e88ca243SArnd Bergmann# ignored, continuing to default to PTRDIFF_MAX. So, left with no other
78e88ca243SArnd Bergmann# choice, we must perform a versioned check to disable this warning.
79e88ca243SArnd Bergmann# https://lore.kernel.org/lkml/20210824115859.187f272f@canb.auug.org.au
80e88ca243SArnd BergmannKBUILD_CFLAGS-$(call gcc-min-version, 90100) += -Wno-alloc-size-larger-than
81e88ca243SArnd BergmannKBUILD_CFLAGS += $(KBUILD_CFLAGS-y) $(CONFIG_CC_IMPLICIT_FALLTHROUGH)
82e88ca243SArnd Bergmann
83e88ca243SArnd Bergmann# Prohibit date/time macros, which would make the build non-deterministic
84e88ca243SArnd BergmannKBUILD_CFLAGS += -Werror=date-time
85e88ca243SArnd Bergmann
86e88ca243SArnd Bergmann# enforce correct pointer usage
87e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-option,-Werror=incompatible-pointer-types)
88e88ca243SArnd Bergmann
89e88ca243SArnd Bergmann# Require designated initializers for all marked structures
90e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-option,-Werror=designated-init)
91e88ca243SArnd Bergmann
92e88ca243SArnd Bergmann# Warn if there is an enum types mismatch
93e88ca243SArnd BergmannKBUILD_CFLAGS += $(call cc-option,-Wenum-conversion)
94e88ca243SArnd Bergmann
95e27128dbSMasahiro Yamada# backward compatibility
96e27128dbSMasahiro YamadaKBUILD_EXTRA_WARN ?= $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)
97e27128dbSMasahiro Yamada
98a86fe353SMasahiro Yamadaifeq ("$(origin W)", "command line")
99e27128dbSMasahiro Yamada  KBUILD_EXTRA_WARN := $(W)
100a86fe353SMasahiro Yamadaendif
101a86fe353SMasahiro Yamada
102e27128dbSMasahiro Yamadaexport KBUILD_EXTRA_WARN
103e27128dbSMasahiro Yamada
10464a91907SMasahiro Yamada#
10564a91907SMasahiro Yamada# W=1 - warnings which may be relevant and do not occur too often
10664a91907SMasahiro Yamada#
107e27128dbSMasahiro Yamadaifneq ($(findstring 1, $(KBUILD_EXTRA_WARN)),)
108a86fe353SMasahiro Yamada
10964a91907SMasahiro YamadaKBUILD_CFLAGS += -Wextra -Wunused -Wno-unused-parameter
11064a91907SMasahiro YamadaKBUILD_CFLAGS += -Wmissing-declarations
11126030cb9SArnd BergmannKBUILD_CFLAGS += $(call cc-option, -Wrestrict)
11264a91907SMasahiro YamadaKBUILD_CFLAGS += -Wmissing-format-attribute
11364a91907SMasahiro YamadaKBUILD_CFLAGS += -Wmissing-prototypes
11464a91907SMasahiro YamadaKBUILD_CFLAGS += -Wold-style-definition
11564a91907SMasahiro YamadaKBUILD_CFLAGS += -Wmissing-include-dirs
11664a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wunused-but-set-variable)
11764a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wunused-const-variable)
11864a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wpacked-not-aligned)
1196d4ab2e9SArnd BergmannKBUILD_CFLAGS += $(call cc-option, -Wformat-overflow)
1206d4ab2e9SArnd BergmannKBUILD_CFLAGS += $(call cc-option, -Wformat-truncation)
1216d4ab2e9SArnd BergmannKBUILD_CFLAGS += $(call cc-option, -Wstringop-overflow)
12264a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wstringop-truncation)
123a86fe353SMasahiro Yamada
12480b6093bSMasahiro YamadaKBUILD_CPPFLAGS += -Wundef
1256863f564SMasahiro YamadaKBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN1
1266863f564SMasahiro Yamada
12726ea6bb1SBehan Websterelse
12826ea6bb1SBehan Webster
12964a91907SMasahiro Yamada# Some diagnostics enabled by default are noisy.
13064a91907SMasahiro Yamada# Suppress them by using -Wno... except for W=1.
1312cd3271bSArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
1322cd3271bSArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
13326030cb9SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, restrict)
1342cd3271bSArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, packed-not-aligned)
1356d4ab2e9SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, format-overflow)
1366d4ab2e9SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, format-truncation)
1376d4ab2e9SArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, stringop-overflow)
1382cd3271bSArnd BergmannKBUILD_CFLAGS += $(call cc-disable-warning, stringop-truncation)
13964a91907SMasahiro Yamada
140076f421dSMasahiro Yamadaifdef CONFIG_CC_IS_CLANG
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
15482f2bc2fSNathan ChancellorKBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast)
155afe956c5SNathan ChancellorKBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare
1561cf5f151SNathan ChancellorKBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access)
15721206351SSami TolvanenKBUILD_CFLAGS += $(call cc-disable-warning, cast-function-type-strict)
15852f86f3eSNathan ChancellorKBUILD_CFLAGS += -Wno-enum-compare-conditional
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
1762cd3271bSArnd Bergmannifdef CONFIG_CC_IS_CLANG
1772cd3271bSArnd BergmannKBUILD_CFLAGS += -Winitializer-overrides
1782cd3271bSArnd Bergmannendif
1792cd3271bSArnd Bergmann
1806863f564SMasahiro YamadaKBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN2
1816863f564SMasahiro Yamada
1822cd3271bSArnd Bergmannelse
1832cd3271bSArnd Bergmann
1842cd3271bSArnd Bergmann# The following turn off the warnings enabled by -Wextra
1852cd3271bSArnd BergmannKBUILD_CFLAGS += -Wno-missing-field-initializers
1862cd3271bSArnd BergmannKBUILD_CFLAGS += -Wno-type-limits
1872cd3271bSArnd BergmannKBUILD_CFLAGS += -Wno-shift-negative-value
1882cd3271bSArnd Bergmann
1892cd3271bSArnd Bergmannifdef CONFIG_CC_IS_CLANG
1903ae5615fSNathan ChancellorKBUILD_CFLAGS += -Wno-enum-enum-conversion
1913ae5615fSNathan Chancellorendif
1923ae5615fSNathan Chancellor
1933ae5615fSNathan Chancellorifdef CONFIG_CC_IS_CLANG
1942cd3271bSArnd BergmannKBUILD_CFLAGS += -Wno-initializer-overrides
1952cd3271bSArnd Bergmannelse
1962cd3271bSArnd BergmannKBUILD_CFLAGS += -Wno-maybe-uninitialized
1972cd3271bSArnd Bergmannendif
1982cd3271bSArnd Bergmann
19964a91907SMasahiro Yamadaendif
20064a91907SMasahiro Yamada
20164a91907SMasahiro Yamada#
20264a91907SMasahiro Yamada# W=3 - more obscure warnings, can most likely be ignored
20364a91907SMasahiro Yamada#
204e27128dbSMasahiro Yamadaifneq ($(findstring 3, $(KBUILD_EXTRA_WARN)),)
20564a91907SMasahiro Yamada
20664a91907SMasahiro YamadaKBUILD_CFLAGS += -Wbad-function-cast
207095fbca0SArnd BergmannKBUILD_CFLAGS += -Wcast-align
20864a91907SMasahiro YamadaKBUILD_CFLAGS += -Wcast-qual
20964a91907SMasahiro YamadaKBUILD_CFLAGS += -Wconversion
21064a91907SMasahiro YamadaKBUILD_CFLAGS += -Wpacked
21164a91907SMasahiro YamadaKBUILD_CFLAGS += -Wpadded
21264a91907SMasahiro YamadaKBUILD_CFLAGS += -Wpointer-arith
21364a91907SMasahiro YamadaKBUILD_CFLAGS += -Wredundant-decls
214a97ea93eSJoe PerchesKBUILD_CFLAGS += -Wsign-compare
21564a91907SMasahiro YamadaKBUILD_CFLAGS += -Wswitch-default
21664a91907SMasahiro YamadaKBUILD_CFLAGS += $(call cc-option, -Wpacked-bitfield-compat)
21764a91907SMasahiro Yamada
2186863f564SMasahiro YamadaKBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3
2196863f564SMasahiro Yamada
2202cd3271bSArnd Bergmannelse
2212cd3271bSArnd Bergmann
2222cd3271bSArnd Bergmann# The following turn off the warnings enabled by -Wextra
2232cd3271bSArnd BergmannKBUILD_CFLAGS += -Wno-sign-compare
2242cd3271bSArnd Bergmann
225a86fe353SMasahiro Yamadaendif
226c77d06e7SYann Droneaud
227c77d06e7SYann Droneaud#
228c77d06e7SYann Droneaud# W=e - error out on warnings
229c77d06e7SYann Droneaud#
230c77d06e7SYann Droneaudifneq ($(findstring e, $(KBUILD_EXTRA_WARN)),)
231c77d06e7SYann Droneaud
232c77d06e7SYann DroneaudKBUILD_CFLAGS += -Werror
233c77d06e7SYann Droneaud
234c77d06e7SYann Droneaudendif
235