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

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"
	# This is very experimental so drop the next line if you really want it
	depends on BROKEN
	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.

config UBSAN_KVM_EL2
	bool "UBSAN for KVM code at EL2"
	depends on ARM64
	help
	  Enable UBSAN when running on ARM64 with KVM in a split mode
	  (nvhe/hvhe/protected) for the hypervisor code running in EL2.
	  In this mode, any UBSAN violation in EL2 would panic the kernel
	  and information similar to UBSAN_TRAP would be printed.

endif	# if UBSAN
