Commit | Line | Data |
---|---|---|
b2441318 | 1 | # SPDX-License-Identifier: GPL-2.0 |
a86fe353 | 2 | # ========================================================================== |
a86fe353 MY |
3 | # make W=... settings |
4 | # | |
c77d06e7 YD |
5 | # There are four warning groups enabled by W=1, W=2, W=3, and W=e |
6 | # They are independent, and can be combined like W=12 or W=123e. | |
a86fe353 MY |
7 | # ========================================================================== |
8 | ||
e88ca243 AB |
9 | # Default set of warnings, always enabled |
10 | KBUILD_CFLAGS += -Wall | |
11 | KBUILD_CFLAGS += -Wundef | |
12 | KBUILD_CFLAGS += -Werror=implicit-function-declaration | |
13 | KBUILD_CFLAGS += -Werror=implicit-int | |
14 | KBUILD_CFLAGS += -Werror=return-type | |
15 | KBUILD_CFLAGS += -Werror=strict-prototypes | |
16 | KBUILD_CFLAGS += -Wno-format-security | |
17 | KBUILD_CFLAGS += -Wno-trigraphs | |
18 | KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,) | |
e88ca243 | 19 | KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member) |
0fcb7085 AB |
20 | KBUILD_CFLAGS += -Wmissing-declarations |
21 | KBUILD_CFLAGS += -Wmissing-prototypes | |
e88ca243 AB |
22 | |
23 | ifneq ($(CONFIG_FRAME_WARN),0) | |
24 | KBUILD_CFLAGS += -Wframe-larger-than=$(CONFIG_FRAME_WARN) | |
25 | endif | |
26 | ||
27 | KBUILD_CPPFLAGS-$(CONFIG_WERROR) += -Werror | |
28 | KBUILD_CPPFLAGS += $(KBUILD_CPPFLAGS-y) | |
29 | KBUILD_CFLAGS-$(CONFIG_CC_NO_ARRAY_BOUNDS) += -Wno-array-bounds | |
30 | ||
31 | ifdef CONFIG_CC_IS_CLANG | |
32 | # The kernel builds with '-std=gnu11' so use of GNU extensions is acceptable. | |
33 | KBUILD_CFLAGS += -Wno-gnu | |
34 | else | |
35 | ||
36 | # gcc inanely warns about local variables called 'main' | |
37 | KBUILD_CFLAGS += -Wno-main | |
38 | endif | |
39 | ||
e88ca243 AB |
40 | # These result in bogus false positives |
41 | KBUILD_CFLAGS += $(call cc-disable-warning, dangling-pointer) | |
42 | ||
43 | # Variable Length Arrays (VLAs) should not be used anywhere in the kernel | |
44 | KBUILD_CFLAGS += -Wvla | |
45 | ||
46 | # disable pointer signed / unsigned warnings in gcc 4.0 | |
47 | KBUILD_CFLAGS += -Wno-pointer-sign | |
48 | ||
49 | # In order to make sure new function cast mismatches are not introduced | |
50 | # in the kernel (to avoid tripping CFI checking), the kernel should be | |
51 | # globally built with -Wcast-function-type. | |
52 | KBUILD_CFLAGS += $(call cc-option, -Wcast-function-type) | |
53 | ||
e88ca243 AB |
54 | # The allocators already balk at large sizes, so silence the compiler |
55 | # warnings for bounds checks involving those possible values. While | |
56 | # -Wno-alloc-size-larger-than would normally be used here, earlier versions | |
57 | # of gcc (<9.1) weirdly don't handle the option correctly when _other_ | |
58 | # warnings are produced (?!). Using -Walloc-size-larger-than=SIZE_MAX | |
59 | # doesn't work (as it is documented to), silently resolving to "0" prior to | |
60 | # version 9.1 (and producing an error more recently). Numeric values larger | |
61 | # than PTRDIFF_MAX also don't work prior to version 9.1, which are silently | |
62 | # ignored, continuing to default to PTRDIFF_MAX. So, left with no other | |
63 | # choice, we must perform a versioned check to disable this warning. | |
64 | # https://lore.kernel.org/lkml/20210824115859.187f272f@canb.auug.org.au | |
65 | KBUILD_CFLAGS-$(call gcc-min-version, 90100) += -Wno-alloc-size-larger-than | |
66 | KBUILD_CFLAGS += $(KBUILD_CFLAGS-y) $(CONFIG_CC_IMPLICIT_FALLTHROUGH) | |
67 | ||
68 | # Prohibit date/time macros, which would make the build non-deterministic | |
69 | KBUILD_CFLAGS += -Werror=date-time | |
70 | ||
71 | # enforce correct pointer usage | |
72 | KBUILD_CFLAGS += $(call cc-option,-Werror=incompatible-pointer-types) | |
73 | ||
74 | # Require designated initializers for all marked structures | |
75 | KBUILD_CFLAGS += $(call cc-option,-Werror=designated-init) | |
76 | ||
77 | # Warn if there is an enum types mismatch | |
78 | KBUILD_CFLAGS += $(call cc-option,-Wenum-conversion) | |
79 | ||
f5982cce AB |
80 | KBUILD_CFLAGS += -Wextra |
81 | KBUILD_CFLAGS += -Wunused | |
82 | ||
64a91907 MY |
83 | # |
84 | # W=1 - warnings which may be relevant and do not occur too often | |
85 | # | |
e27128db | 86 | ifneq ($(findstring 1, $(KBUILD_EXTRA_WARN)),) |
a86fe353 | 87 | |
64a91907 | 88 | KBUILD_CFLAGS += -Wmissing-format-attribute |
64a91907 | 89 | KBUILD_CFLAGS += -Wmissing-include-dirs |
64a91907 | 90 | KBUILD_CFLAGS += $(call cc-option, -Wunused-const-variable) |
a86fe353 | 91 | |
80b6093b | 92 | KBUILD_CPPFLAGS += -Wundef |
6863f564 MY |
93 | KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN1 |
94 | ||
26ea6bb1 BW |
95 | else |
96 | ||
64a91907 MY |
97 | # Some diagnostics enabled by default are noisy. |
98 | # Suppress them by using -Wno... except for W=1. | |
2cd3271b AB |
99 | KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable) |
100 | KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable) | |
101 | KBUILD_CFLAGS += $(call cc-disable-warning, packed-not-aligned) | |
6d4ab2e9 | 102 | KBUILD_CFLAGS += $(call cc-disable-warning, format-overflow) |
908dd508 | 103 | ifdef CONFIG_CC_IS_GCC |
6d4ab2e9 | 104 | KBUILD_CFLAGS += $(call cc-disable-warning, format-truncation) |
908dd508 AB |
105 | else |
106 | # Clang checks for overflow/truncation with '%p', while GCC does not: | |
107 | # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111219 | |
108 | KBUILD_CFLAGS += $(call cc-disable-warning, format-overflow-non-kprintf) | |
109 | KBUILD_CFLAGS += $(call cc-disable-warning, format-truncation-non-kprintf) | |
110 | endif | |
2cd3271b | 111 | KBUILD_CFLAGS += $(call cc-disable-warning, stringop-truncation) |
64a91907 | 112 | |
c40845e3 AB |
113 | KBUILD_CFLAGS += -Wno-override-init # alias for -Wno-initializer-overrides in clang |
114 | ||
076f421d | 115 | ifdef CONFIG_CC_IS_CLANG |
b0839b28 | 116 | # Clang before clang-16 would warn on default argument promotions. |
88b61e3b | 117 | ifneq ($(call clang-min-version, 160000),y) |
b0839b28 | 118 | # Disable -Wformat |
21f9c8a1 | 119 | KBUILD_CFLAGS += -Wno-format |
b0839b28 ND |
120 | # Then re-enable flags that were part of the -Wformat group that aren't |
121 | # problematic. | |
122 | KBUILD_CFLAGS += -Wformat-extra-args -Wformat-invalid-specifier | |
123 | KBUILD_CFLAGS += -Wformat-zero-length -Wnonnull | |
124 | # Requires clang-12+. | |
88b61e3b | 125 | ifeq ($(call clang-min-version, 120000),y) |
b0839b28 ND |
126 | KBUILD_CFLAGS += -Wformat-insufficient-args |
127 | endif | |
128 | endif | |
82f2bc2f | 129 | KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) |
afe956c5 | 130 | KBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare |
1cf5f151 | 131 | KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) |
21206351 | 132 | KBUILD_CFLAGS += $(call cc-disable-warning, cast-function-type-strict) |
75b5ab13 NC |
133 | KBUILD_CFLAGS += -Wno-enum-compare-conditional |
134 | KBUILD_CFLAGS += -Wno-enum-enum-conversion | |
26ea6bb1 | 135 | endif |
64a91907 MY |
136 | |
137 | endif | |
138 | ||
139 | # | |
140 | # W=2 - warnings which occur quite often but may still be relevant | |
141 | # | |
e27128db | 142 | ifneq ($(findstring 2, $(KBUILD_EXTRA_WARN)),) |
64a91907 | 143 | |
64a91907 | 144 | KBUILD_CFLAGS += -Wdisabled-optimization |
64a91907 MY |
145 | KBUILD_CFLAGS += -Wshadow |
146 | KBUILD_CFLAGS += $(call cc-option, -Wlogical-op) | |
64a91907 MY |
147 | KBUILD_CFLAGS += $(call cc-option, -Wunused-macros) |
148 | ||
6863f564 MY |
149 | KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN2 |
150 | ||
2cd3271b AB |
151 | else |
152 | ||
153 | # The following turn off the warnings enabled by -Wextra | |
154 | KBUILD_CFLAGS += -Wno-missing-field-initializers | |
155 | KBUILD_CFLAGS += -Wno-type-limits | |
156 | KBUILD_CFLAGS += -Wno-shift-negative-value | |
157 | ||
c40845e3 | 158 | ifdef CONFIG_CC_IS_GCC |
2cd3271b AB |
159 | KBUILD_CFLAGS += -Wno-maybe-uninitialized |
160 | endif | |
161 | ||
64a91907 MY |
162 | endif |
163 | ||
164 | # | |
165 | # W=3 - more obscure warnings, can most likely be ignored | |
166 | # | |
e27128db | 167 | ifneq ($(findstring 3, $(KBUILD_EXTRA_WARN)),) |
64a91907 MY |
168 | |
169 | KBUILD_CFLAGS += -Wbad-function-cast | |
095fbca0 | 170 | KBUILD_CFLAGS += -Wcast-align |
64a91907 MY |
171 | KBUILD_CFLAGS += -Wcast-qual |
172 | KBUILD_CFLAGS += -Wconversion | |
173 | KBUILD_CFLAGS += -Wpacked | |
174 | KBUILD_CFLAGS += -Wpadded | |
175 | KBUILD_CFLAGS += -Wpointer-arith | |
176 | KBUILD_CFLAGS += -Wredundant-decls | |
a97ea93e | 177 | KBUILD_CFLAGS += -Wsign-compare |
64a91907 | 178 | KBUILD_CFLAGS += -Wswitch-default |
64a91907 | 179 | |
6863f564 MY |
180 | KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3 |
181 | ||
2cd3271b AB |
182 | else |
183 | ||
184 | # The following turn off the warnings enabled by -Wextra | |
185 | KBUILD_CFLAGS += -Wno-sign-compare | |
f5982cce | 186 | KBUILD_CFLAGS += -Wno-unused-parameter |
2cd3271b | 187 | |
a86fe353 | 188 | endif |
c77d06e7 YD |
189 | |
190 | # | |
191 | # W=e - error out on warnings | |
192 | # | |
193 | ifneq ($(findstring e, $(KBUILD_EXTRA_WARN)),) | |
194 | ||
195 | KBUILD_CFLAGS += -Werror | |
196 | ||
197 | endif |