# 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_SIGNED_WRAP
	bool "Perform checking for signed arithmetic wrap-around"
	default UBSAN
	depends on !COMPILE_TEST
	# The no_sanitize attribute was introduced in GCC with version 8.
	depends on !CC_IS_GCC || GCC_VERSION >= 80000
	depends on $(cc-option,-fsanitize=signed-integer-overflow)
	help
	  This option enables -fsanitize=signed-integer-overflow which checks
	  for wrap-around of any arithmetic operations with signed integers.
	  This currently performs nearly no instrumentation due to the
	  kernel's use of -fno-strict-overflow which converts all would-be
	  arithmetic undefined behavior into wrap-around arithmetic. Future
	  sanitizer versions will allow for wrap-around checking (rather than
	  exclusively undefined behavior).

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
