# SPDX-License-Identifier: GPL-2.0-only
config ARCH_HAS_UBSAN
	bool

menuconfig UBSAN
	bool "Undefined behaviour sanity checker"
	depends on ARCH_HAS_UBSAN
	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 "Abort on Sanitizer warnings (smaller kernel but less verbose)"
	depends on !COMPILE_TEST
	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.

	  Also note that selecting Y will cause your kernel to Oops
	  with an "illegal instruction" error with no further details
	  when a UBSAN violation occurs. (Except on arm64 and x86, which
	  will report which Sanitizer failed.) This may make it hard to
	  determine whether an Oops was caused by UBSAN or to figure
	  out the details of a UBSAN violation. It makes the kernel log
	  output less useful for bug reports.

config CC_HAS_UBSAN_BOUNDS_STRICT
	def_bool $(cc-option,-fsanitize=bounds-strict)
	help
	  The -fsanitize=bounds-strict option is only available on GCC,
	  but uses the more strict handling of arrays that includes knowledge
	  of flexible arrays, which is comparable to Clang's regular
	  -fsanitize=bounds.

config CC_HAS_UBSAN_ARRAY_BOUNDS
	def_bool $(cc-option,-fsanitize=array-bounds)
	help
	  Under Clang, the -fsanitize=bounds option is actually composed
	  of two more specific options, -fsanitize=array-bounds and
	  -fsanitize=local-bounds. However, -fsanitize=local-bounds can
	  only be used when trap mode is enabled. (See also the help for
	  CONFIG_LOCAL_BOUNDS.) Explicitly check for -fsanitize=array-bounds
	  so that we can build up the options needed for UBSAN_BOUNDS
	  with or without UBSAN_TRAP.

config UBSAN_BOUNDS
	bool "Perform array index bounds checking"
	default UBSAN
	depends on CC_HAS_UBSAN_ARRAY_BOUNDS || CC_HAS_UBSAN_BOUNDS_STRICT
	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_BOUNDS_STRICT
	def_bool UBSAN_BOUNDS && CC_HAS_UBSAN_BOUNDS_STRICT
	help
	  GCC's bounds sanitizer. This option is used to select the
	  correct options in Makefile.ubsan.

config UBSAN_ARRAY_BOUNDS
	def_bool UBSAN_BOUNDS && CC_HAS_UBSAN_ARRAY_BOUNDS
	help
	  Clang's array bounds sanitizer. This option is used to select
	  the correct options in Makefile.ubsan.

config UBSAN_LOCAL_BOUNDS
	def_bool UBSAN_ARRAY_BOUNDS && UBSAN_TRAP
	help
	  This option enables Clang's -fsanitize=local-bounds which traps
	  when an access 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. Since this option is
	  trap-only, it depends on CONFIG_UBSAN_TRAP.

config UBSAN_SHIFT
	bool "Perform checking for bit-shift overflows"
	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_INTEGER_WRAP
	bool "Perform checking for integer arithmetic wrap-around"
	depends on !COMPILE_TEST
	depends on $(cc-option,-fsanitize-undefined-ignore-overflow-pattern=all)
	depends on $(cc-option,-fsanitize=signed-integer-overflow)
	depends on $(cc-option,-fsanitize=unsigned-integer-overflow)
	depends on $(cc-option,-fsanitize=implicit-signed-integer-truncation)
	depends on $(cc-option,-fsanitize=implicit-unsigned-integer-truncation)
	depends on $(cc-option,-fsanitize-ignorelist=/dev/null)
	help
	  This option enables all of the sanitizers involved in integer overflow
	  (wrap-around) mitigation: signed-integer-overflow, unsigned-integer-overflow,
	  implicit-signed-integer-truncation, and implicit-unsigned-integer-truncation.
	  This is currently limited only to the size_t type while testing and
	  compiler development continues.

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 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
