123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- # 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 !COMPILE_TEST
- 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 CC_HAS_UBSAN_BOUNDS
- def_bool $(cc-option,-fsanitize=bounds)
- config CC_HAS_UBSAN_ARRAY_BOUNDS
- def_bool $(cc-option,-fsanitize=array-bounds)
- config UBSAN_BOUNDS
- bool "Perform array index bounds checking"
- default UBSAN
- depends on CC_HAS_UBSAN_ARRAY_BOUNDS || CC_HAS_UBSAN_BOUNDS
- 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_ONLY_BOUNDS
- def_bool CC_HAS_UBSAN_BOUNDS && !CC_HAS_UBSAN_ARRAY_BOUNDS
- depends on UBSAN_BOUNDS
- help
- This is a weird case: Clang's -fsanitize=bounds includes
- -fsanitize=local-bounds, but it's trapping-only, so for
- Clang, we must use -fsanitize=array-bounds when we want
- traditional array bounds checking enabled. For GCC, we
- want -fsanitize=bounds.
- config UBSAN_ARRAY_BOUNDS
- def_bool CC_HAS_UBSAN_ARRAY_BOUNDS
- depends on UBSAN_BOUNDS
- config UBSAN_LOCAL_BOUNDS
- bool "Perform array local bounds checking"
- depends on UBSAN_TRAP
- depends on $(cc-option,-fsanitize=local-bounds)
- help
- This option enables -fsanitize=local-bounds which traps when an
- exception/error is detected. Therefore, it may only be enabled
- with CONFIG_UBSAN_TRAP.
- 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_SHIFT
- bool "Perform checking for bit-shift overflows"
- default UBSAN
- depends on $(cc-option,-fsanitize=shift)
- help
- This option enables -fsanitize=shift which checks for bit-shift
- operations that overflow to the left or go switch to negative
- for signed types.
- config UBSAN_DIV_ZERO
- bool "Perform checking for integer divide-by-zero"
- depends on $(cc-option,-fsanitize=integer-divide-by-zero)
- # https://github.com/ClangBuiltLinux/linux/issues/1657
- # https://github.com/llvm/llvm-project/issues/56289
- depends on !CC_IS_CLANG
- help
- This option enables -fsanitize=integer-divide-by-zero which checks
- for integer division by zero. This is effectively redundant with the
- kernel's existing exception handling, though it can provide greater
- debugging information under CONFIG_UBSAN_REPORT_FULL.
- config UBSAN_UNREACHABLE
- bool "Perform checking for unreachable code"
- # objtool already handles unreachable checking and gets angry about
- # seeing UBSan instrumentation located in unreachable places.
- depends on !(OBJTOOL && (STACK_VALIDATION || UNWINDER_ORC || HAVE_UACCESS_VALIDATION))
- depends on $(cc-option,-fsanitize=unreachable)
- help
- This option enables -fsanitize=unreachable which checks for control
- flow reaching an expected-to-be-unreachable position.
- config UBSAN_BOOL
- bool "Perform checking for non-boolean values used as boolean"
- default UBSAN
- depends on $(cc-option,-fsanitize=bool)
- help
- This option enables -fsanitize=bool which checks for boolean values being
- loaded that are neither 0 nor 1.
- config UBSAN_ENUM
- bool "Perform checking for out of bounds enum values"
- default UBSAN
- depends on $(cc-option,-fsanitize=enum)
- help
- This option enables -fsanitize=enum which checks for values being loaded
- into an enum that are outside the range of given values for the given enum.
- config UBSAN_ALIGNMENT
- bool "Perform checking for misaligned pointer usage"
- default !HAVE_EFFICIENT_UNALIGNED_ACCESS
- depends on !UBSAN_TRAP && !COMPILE_TEST
- depends on $(cc-option,-fsanitize=alignment)
- 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 UBSAN_SANITIZE_ALL
- bool "Enable instrumentation for the entire kernel"
- depends on ARCH_HAS_UBSAN_SANITIZE_ALL
- 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 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
|