]>
Commit | Line | Data |
---|---|---|
ec8f24b7 | 1 | # SPDX-License-Identifier: GPL-2.0-only |
c6d30853 AR |
2 | config ARCH_HAS_UBSAN_SANITIZE_ALL |
3 | bool | |
4 | ||
277a1085 | 5 | menuconfig UBSAN |
c6d30853 AR |
6 | bool "Undefined behaviour sanity checker" |
7 | help | |
0887a7eb | 8 | This option enables the Undefined Behaviour sanity checker. |
c6d30853 | 9 | Compile-time instrumentation is used to detect various undefined |
0887a7eb KC |
10 | behaviours at runtime. For more details, see: |
11 | Documentation/dev-tools/ubsan.rst | |
12 | ||
277a1085 KC |
13 | if UBSAN |
14 | ||
0887a7eb KC |
15 | config UBSAN_TRAP |
16 | bool "On Sanitizer warnings, abort the running kernel code" | |
79791378 | 17 | depends on !COMPILE_TEST |
0887a7eb KC |
18 | depends on $(cc-option, -fsanitize-undefined-trap-on-error) |
19 | help | |
20 | Building kernels with Sanitizer features enabled tends to grow | |
21 | the kernel size by around 5%, due to adding all the debugging | |
22 | text on failure paths. To avoid this, Sanitizer instrumentation | |
23 | can just issue a trap. This reduces the kernel size overhead but | |
24 | turns all warnings (including potentially harmless conditions) | |
25 | into full exceptions that abort the running kernel code | |
26 | (regardless of context, locks held, etc), which may destabilize | |
27 | the system. For some system builders this is an acceptable | |
28 | trade-off. | |
c6d30853 | 29 | |
ea91a1d4 AB |
30 | config UBSAN_KCOV_BROKEN |
31 | def_bool KCOV && CC_HAS_SANCOV_TRACE_PC | |
32 | depends on CC_IS_CLANG | |
33 | depends on !$(cc-option,-Werror=unused-command-line-argument -fsanitize=bounds -fsanitize-coverage=trace-pc) | |
34 | help | |
35 | Some versions of clang support either UBSAN or KCOV but not the | |
36 | combination of the two. | |
37 | See https://bugs.llvm.org/show_bug.cgi?id=45831 for the status | |
38 | in newer releases. | |
39 | ||
cdf8a76f KC |
40 | config CC_HAS_UBSAN_BOUNDS |
41 | def_bool $(cc-option,-fsanitize=bounds) | |
42 | ||
43 | config CC_HAS_UBSAN_ARRAY_BOUNDS | |
44 | def_bool $(cc-option,-fsanitize=array-bounds) | |
45 | ||
277a1085 KC |
46 | config UBSAN_BOUNDS |
47 | bool "Perform array index bounds checking" | |
48 | default UBSAN | |
ea91a1d4 | 49 | depends on !UBSAN_KCOV_BROKEN |
cdf8a76f | 50 | depends on CC_HAS_UBSAN_ARRAY_BOUNDS || CC_HAS_UBSAN_BOUNDS |
277a1085 KC |
51 | help |
52 | This option enables detection of directly indexed out of bounds | |
53 | array accesses, where the array size is known at compile time. | |
54 | Note that this does not protect array overflows via bad calls | |
55 | to the {str,mem}*cpy() family of functions (that is addressed | |
56 | by CONFIG_FORTIFY_SOURCE). | |
57 | ||
cdf8a76f KC |
58 | config UBSAN_ONLY_BOUNDS |
59 | def_bool CC_HAS_UBSAN_BOUNDS && !CC_HAS_UBSAN_ARRAY_BOUNDS | |
60 | depends on UBSAN_BOUNDS | |
61 | help | |
62 | This is a weird case: Clang's -fsanitize=bounds includes | |
63 | -fsanitize=local-bounds, but it's trapping-only, so for | |
64 | Clang, we must use -fsanitize=array-bounds when we want | |
65 | traditional array bounds checking enabled. For GCC, we | |
66 | want -fsanitize=bounds. | |
67 | ||
68 | config UBSAN_ARRAY_BOUNDS | |
69 | def_bool CC_HAS_UBSAN_ARRAY_BOUNDS | |
70 | depends on UBSAN_BOUNDS | |
71 | ||
6a6155f6 GP |
72 | config UBSAN_LOCAL_BOUNDS |
73 | bool "Perform array local bounds checking" | |
74 | depends on UBSAN_TRAP | |
6a6155f6 | 75 | depends on !UBSAN_KCOV_BROKEN |
cdf8a76f | 76 | depends on $(cc-option,-fsanitize=local-bounds) |
6a6155f6 GP |
77 | help |
78 | This option enables -fsanitize=local-bounds which traps when an | |
cdf8a76f KC |
79 | exception/error is detected. Therefore, it may only be enabled |
80 | with CONFIG_UBSAN_TRAP. | |
81 | ||
6a6155f6 GP |
82 | Enabling this option detects errors due to accesses through a |
83 | pointer that is derived from an object of a statically-known size, | |
84 | where an added offset (which may not be known statically) is | |
85 | out-of-bounds. | |
86 | ||
cdf8a76f | 87 | config UBSAN_SHIFT |
c637693b KC |
88 | bool "Perform checking for bit-shift overflows" |
89 | default UBSAN | |
cdf8a76f | 90 | depends on $(cc-option,-fsanitize=shift) |
c637693b KC |
91 | help |
92 | This option enables -fsanitize=shift which checks for bit-shift | |
93 | operations that overflow to the left or go switch to negative | |
94 | for signed types. | |
cdf8a76f KC |
95 | |
96 | config UBSAN_DIV_ZERO | |
c637693b | 97 | bool "Perform checking for integer divide-by-zero" |
cdf8a76f | 98 | depends on $(cc-option,-fsanitize=integer-divide-by-zero) |
c637693b KC |
99 | help |
100 | This option enables -fsanitize=integer-divide-by-zero which checks | |
101 | for integer division by zero. This is effectively redundant with the | |
102 | kernel's existing exception handling, though it can provide greater | |
103 | debugging information under CONFIG_UBSAN_REPORT_FULL. | |
cdf8a76f KC |
104 | |
105 | config UBSAN_UNREACHABLE | |
c637693b KC |
106 | bool "Perform checking for unreachable code" |
107 | # objtool already handles unreachable checking and gets angry about | |
108 | # seeing UBSan instrumentation located in unreachable places. | |
109 | depends on !STACK_VALIDATION | |
cdf8a76f | 110 | depends on $(cc-option,-fsanitize=unreachable) |
c637693b KC |
111 | help |
112 | This option enables -fsanitize=unreachable which checks for control | |
113 | flow reaching an expected-to-be-unreachable position. | |
cdf8a76f | 114 | |
cdf8a76f | 115 | config UBSAN_OBJECT_SIZE |
c637693b KC |
116 | bool "Perform checking for accesses beyond the end of objects" |
117 | default UBSAN | |
61e0349f KC |
118 | # gcc hugely expands stack usage with -fsanitize=object-size |
119 | # https://lore.kernel.org/lkml/CAHk-=wjPasyJrDuwDnpHJS2TuQfExwe=px-SzLeN8GFMAQJPmQ@mail.gmail.com/ | |
120 | depends on !CC_IS_GCC | |
cdf8a76f | 121 | depends on $(cc-option,-fsanitize=object-size) |
c637693b KC |
122 | help |
123 | This option enables -fsanitize=object-size which checks for accesses | |
124 | beyond the end of objects where the optimizer can determine both the | |
125 | object being operated on and its size, usually seen with bad downcasts, | |
126 | or access to struct members from NULL pointers. | |
cdf8a76f KC |
127 | |
128 | config UBSAN_BOOL | |
c637693b KC |
129 | bool "Perform checking for non-boolean values used as boolean" |
130 | default UBSAN | |
cdf8a76f | 131 | depends on $(cc-option,-fsanitize=bool) |
c637693b KC |
132 | help |
133 | This option enables -fsanitize=bool which checks for boolean values being | |
134 | loaded that are neither 0 nor 1. | |
cdf8a76f KC |
135 | |
136 | config UBSAN_ENUM | |
c637693b KC |
137 | bool "Perform checking for out of bounds enum values" |
138 | default UBSAN | |
cdf8a76f | 139 | depends on $(cc-option,-fsanitize=enum) |
c637693b KC |
140 | help |
141 | This option enables -fsanitize=enum which checks for values being loaded | |
142 | into an enum that are outside the range of given values for the given enum. | |
143 | ||
144 | config UBSAN_ALIGNMENT | |
145 | bool "Perform checking for misaligned pointer usage" | |
146 | default !HAVE_EFFICIENT_UNALIGNED_ACCESS | |
147 | depends on !UBSAN_TRAP && !COMPILE_TEST | |
148 | depends on $(cc-option,-fsanitize=alignment) | |
149 | help | |
150 | This option enables the check of unaligned memory accesses. | |
151 | Enabling this option on architectures that support unaligned | |
152 | accesses may produce a lot of false positives. | |
cdf8a76f | 153 | |
c6d30853 AR |
154 | config UBSAN_SANITIZE_ALL |
155 | bool "Enable instrumentation for the entire kernel" | |
c6d30853 AR |
156 | depends on ARCH_HAS_UBSAN_SANITIZE_ALL |
157 | default y | |
158 | help | |
159 | This option activates instrumentation for the entire kernel. | |
160 | If you don't enable this option, you have to explicitly specify | |
161 | UBSAN_SANITIZE := y for the files/directories you want to check for UB. | |
7707535a YS |
162 | Enabling this option will get kernel image size increased |
163 | significantly. | |
c6d30853 | 164 | |
854686f4 JP |
165 | config TEST_UBSAN |
166 | tristate "Module for testing for undefined behavior detection" | |
277a1085 | 167 | depends on m |
854686f4 JP |
168 | help |
169 | This is a test module for UBSAN. | |
170 | It triggers various undefined behavior, and detect it. | |
277a1085 KC |
171 | |
172 | endif # if UBSAN |