Kconfig.ubsan 5.2 KB
Newer Older
1
# SPDX-License-Identifier: GPL-2.0-only
2 3 4
config ARCH_HAS_UBSAN_SANITIZE_ALL
	bool

5
menuconfig UBSAN
6 7
	bool "Undefined behaviour sanity checker"
	help
8
	  This option enables the Undefined Behaviour sanity checker.
9
	  Compile-time instrumentation is used to detect various undefined
10 11 12
	  behaviours at runtime. For more details, see:
	  Documentation/dev-tools/ubsan.rst

13 14
if UBSAN

15 16
config UBSAN_TRAP
	bool "On Sanitizer warnings, abort the running kernel code"
17
	depends on !COMPILE_TEST
18 19 20 21 22 23 24 25 26 27 28
	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.
29

30 31 32 33 34 35 36 37 38 39
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.

40 41 42 43 44 45
config CC_HAS_UBSAN_BOUNDS
	def_bool $(cc-option,-fsanitize=bounds)

config CC_HAS_UBSAN_ARRAY_BOUNDS
	def_bool $(cc-option,-fsanitize=array-bounds)

46 47 48
config UBSAN_BOUNDS
	bool "Perform array index bounds checking"
	default UBSAN
49
	depends on !UBSAN_KCOV_BROKEN
50
	depends on CC_HAS_UBSAN_ARRAY_BOUNDS || CC_HAS_UBSAN_BOUNDS
51 52 53 54 55 56 57
	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).

58 59 60 61 62 63 64 65 66 67 68 69 70 71
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

72 73 74 75
config UBSAN_LOCAL_BOUNDS
	bool "Perform array local bounds checking"
	depends on UBSAN_TRAP
	depends on !UBSAN_KCOV_BROKEN
76
	depends on $(cc-option,-fsanitize=local-bounds)
77 78
	help
	  This option enables -fsanitize=local-bounds which traps when an
79 80 81
	  exception/error is detected. Therefore, it may only be enabled
	  with CONFIG_UBSAN_TRAP.

82 83 84 85 86
	  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.

87 88 89 90 91 92 93 94
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.

95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
config UBSAN_SHIFT
	def_bool UBSAN_MISC
	depends on $(cc-option,-fsanitize=shift)

config UBSAN_DIV_ZERO
	def_bool UBSAN_MISC
	depends on $(cc-option,-fsanitize=integer-divide-by-zero)

config UBSAN_UNREACHABLE
	def_bool UBSAN_MISC
	depends on $(cc-option,-fsanitize=unreachable)

config UBSAN_SIGNED_OVERFLOW
	def_bool UBSAN_MISC
	depends on $(cc-option,-fsanitize=signed-integer-overflow)

config UBSAN_UNSIGNED_OVERFLOW
	def_bool UBSAN_MISC
	depends on $(cc-option,-fsanitize=unsigned-integer-overflow)

config UBSAN_OBJECT_SIZE
	def_bool UBSAN_MISC
117 118 119
	# gcc hugely expands stack usage with -fsanitize=object-size
	# https://lore.kernel.org/lkml/CAHk-=wjPasyJrDuwDnpHJS2TuQfExwe=px-SzLeN8GFMAQJPmQ@mail.gmail.com/
	depends on !CC_IS_GCC
120 121 122 123 124 125 126 127 128 129
	depends on $(cc-option,-fsanitize=object-size)

config UBSAN_BOOL
	def_bool UBSAN_MISC
	depends on $(cc-option,-fsanitize=bool)

config UBSAN_ENUM
	def_bool UBSAN_MISC
	depends on $(cc-option,-fsanitize=enum)

130 131 132 133 134 135 136 137
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.
Y
Yang Shi 已提交
138 139
	  Enabling this option will get kernel image size increased
	  significantly.
140

141 142 143
config UBSAN_ALIGNMENT
	bool "Enable checks for pointers alignment"
	default !HAVE_EFFICIENT_UNALIGNED_ACCESS
K
Kees Cook 已提交
144
	depends on !UBSAN_TRAP && !COMPILE_TEST
145
	depends on $(cc-option,-fsanitize=alignment)
146
	help
147 148
	  This option enables the check of unaligned memory accesses.
	  Enabling this option on architectures that support unaligned
149
	  accesses may produce a lot of false positives.
150

J
Jinbum Park 已提交
151 152
config TEST_UBSAN
	tristate "Module for testing for undefined behavior detection"
153
	depends on m
J
Jinbum Park 已提交
154 155 156
	help
	  This is a test module for UBSAN.
	  It triggers various undefined behavior, and detect it.
157 158

endif	# if UBSAN