| # SPDX-License-Identifier: GPL-2.0-only |
| config ARCH_HAS_UBSAN_SANITIZE_ALL |
| bool |
| |
| menuconfig UBSAN |
| bool "Undefined behaviour sanity checker" |
| help |
| This option enables the Undefined Behaviour sanity checker. |
| Compile-time instrumentation is used to detect various undefined |
| behaviours at runtime. For more details, see: |
| Documentation/dev-tools/ubsan.rst |
| |
| if UBSAN |
| |
| config UBSAN_TRAP |
| bool "On Sanitizer warnings, abort the running kernel code" |
| depends on $(cc-option, -fsanitize-undefined-trap-on-error) |
| help |
| Building kernels with Sanitizer features enabled tends to grow |
| the kernel size by around 5%, due to adding all the debugging |
| text on failure paths. To avoid this, Sanitizer instrumentation |
| can just issue a trap. This reduces the kernel size overhead but |
| turns all warnings (including potentially harmless conditions) |
| into full exceptions that abort the running kernel code |
| (regardless of context, locks held, etc), which may destabilize |
| the system. For some system builders this is an acceptable |
| trade-off. |
| |
| config UBSAN_KCOV_BROKEN |
| def_bool KCOV && CC_HAS_SANCOV_TRACE_PC |
| depends on CC_IS_CLANG |
| depends on !$(cc-option,-Werror=unused-command-line-argument -fsanitize=bounds -fsanitize-coverage=trace-pc) |
| help |
| Some versions of clang support either UBSAN or KCOV but not the |
| combination of the two. |
| See https://bugs.llvm.org/show_bug.cgi?id=45831 for the status |
| in newer releases. |
| |
| config UBSAN_BOUNDS |
| bool "Perform array index bounds checking" |
| default UBSAN |
| depends on !UBSAN_KCOV_BROKEN |
| help |
| This option enables detection of directly indexed out of bounds |
| array accesses, where the array size is known at compile time. |
| Note that this does not protect array overflows via bad calls |
| to the {str,mem}*cpy() family of functions (that is addressed |
| by CONFIG_FORTIFY_SOURCE). |
| |
| config UBSAN_LOCAL_BOUNDS |
| bool "Perform array local bounds checking" |
| depends on UBSAN_TRAP |
| depends on CC_IS_CLANG |
| depends on !UBSAN_KCOV_BROKEN |
| help |
| This option enables -fsanitize=local-bounds which traps when an |
| exception/error is detected. Therefore, it should be enabled only |
| if trapping is expected. |
| Enabling this option detects errors due to accesses through a |
| pointer that is derived from an object of a statically-known size, |
| where an added offset (which may not be known statically) is |
| out-of-bounds. |
| |
| config UBSAN_MISC |
| bool "Enable all other Undefined Behavior sanity checks" |
| default UBSAN |
| help |
| This option enables all sanity checks that don't have their |
| own Kconfig options. Disable this if you only want to have |
| individually selected checks. |
| |
| config UBSAN_SANITIZE_ALL |
| bool "Enable instrumentation for the entire kernel" |
| depends on ARCH_HAS_UBSAN_SANITIZE_ALL |
| |
| # We build with -Wno-maybe-uninitilzed, but we still want to |
| # use -Wmaybe-uninitilized in allmodconfig builds. |
| # So dependsy bellow used to disable this option in allmodconfig |
| depends on !COMPILE_TEST |
| default y |
| help |
| This option activates instrumentation for the entire kernel. |
| If you don't enable this option, you have to explicitly specify |
| UBSAN_SANITIZE := y for the files/directories you want to check for UB. |
| Enabling this option will get kernel image size increased |
| significantly. |
| |
| config UBSAN_ALIGNMENT |
| bool "Enable checks for pointers alignment" |
| default !HAVE_EFFICIENT_UNALIGNED_ACCESS |
| depends on !UBSAN_TRAP |
| help |
| This option enables the check of unaligned memory accesses. |
| Enabling this option on architectures that support unaligned |
| accesses may produce a lot of false positives. |
| |
| config TEST_UBSAN |
| tristate "Module for testing for undefined behavior detection" |
| depends on m |
| help |
| This is a test module for UBSAN. |
| It triggers various undefined behavior, and detect it. |
| |
| endif # if UBSAN |