config ARCH_HAS_UBSAN_SANITIZE_ALL
        bool
 
-config UBSAN
+menuconfig UBSAN
        bool "Undefined behaviour sanity checker"
        help
          This option enables the Undefined Behaviour sanity checker.
          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 UBSAN
        depends on $(cc-option, -fsanitize-undefined-trap-on-error)
        help
          Building kernels with Sanitizer features enabled tends to grow
          the system. For some system builders this is an acceptable
          trade-off.
 
+config UBSAN_BOUNDS
+       bool "Perform array index bounds checking"
+       default UBSAN
+       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_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.
+
 config UBSAN_SANITIZE_ALL
        bool "Enable instrumentation for the entire kernel"
-       depends on UBSAN
        depends on ARCH_HAS_UBSAN_SANITIZE_ALL
 
        # We build with -Wno-maybe-uninitilzed, but we still want to
 
 config UBSAN_NO_ALIGNMENT
        bool "Disable checking of pointers alignment"
-       depends on UBSAN
        default y if HAVE_EFFICIENT_UNALIGNED_ACCESS
        help
          This option disables the check of unaligned memory accesses.
 
 config TEST_UBSAN
        tristate "Module for testing for undefined behavior detection"
-       depends on m && UBSAN
+       depends on m
        help
          This is a test module for UBSAN.
          It triggers various undefined behavior, and detect it.
+
+endif  # if UBSAN
 
       CFLAGS_UBSAN += $(call cc-option, -fsanitize=alignment)
 endif
 
+ifdef CONFIG_UBSAN_BOUNDS
+      CFLAGS_UBSAN += $(call cc-option, -fsanitize=bounds)
+endif
+
+ifdef CONFIG_UBSAN_MISC
       CFLAGS_UBSAN += $(call cc-option, -fsanitize=shift)
       CFLAGS_UBSAN += $(call cc-option, -fsanitize=integer-divide-by-zero)
       CFLAGS_UBSAN += $(call cc-option, -fsanitize=unreachable)
       CFLAGS_UBSAN += $(call cc-option, -fsanitize=signed-integer-overflow)
-      CFLAGS_UBSAN += $(call cc-option, -fsanitize=bounds)
       CFLAGS_UBSAN += $(call cc-option, -fsanitize=object-size)
       CFLAGS_UBSAN += $(call cc-option, -fsanitize=bool)
       CFLAGS_UBSAN += $(call cc-option, -fsanitize=enum)
+endif
 
 ifdef CONFIG_UBSAN_TRAP
       CFLAGS_UBSAN += $(call cc-option, -fsanitize-undefined-trap-on-error)