Variable Length Arrays (VLAs) on the stack must not be used in the kernel. Function parameter VLAs[1] should be usable, but -Wvla will warn for those. For example, this will produce a warning but it is not using a stack VLA: int something(size_t n, int array[n]) { ... Clang has no way yet to distinguish between the VLA types[2], so depend on GCC for now to keep stack VLAs out of the tree by using GCC's -Wvla-larger-than=N option (though GCC may split -Wvla similarly[3] to how Clang is planning to). While GCC 8+ supports -Wvla-larger-than, only 9+ supports ...=0[4], so use -Wvla-larger-than=1. Adjust mm/kasan/Makefile to remove it from CFLAGS (GCC <9 appears unable to disable the warning correctly[5]). The VLA usage in lib/test_ubsan.c was removed in commit 9d7ca61b1366 ("lib/test_ubsan.c: VLA no longer used in kernel") so the lib/Makefile disabling of VLA checking can be entirely removed.
Unified · Split
| @@ -71,7 +71,6 @@ CFLAGS_test_bitops.o += -Werror · 70 unmodified lines | |||
| 71 | obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o | 71 | obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o |
| 72 | obj-$(CONFIG_TEST_IDA) += test_ida.o | 72 | obj-$(CONFIG_TEST_IDA) += test_ida.o |
| 73 | obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o | 73 | obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o |
| 74 | CFLAGS_test_ubsan.o += $(call cc-disable-warning, vla) | ||
| 75 | CFLAGS_test_ubsan.o += $(call cc-disable-warning, unused-but-set-variable) | 74 | CFLAGS_test_ubsan.o += $(call cc-disable-warning, unused-but-set-variable) |
| 76 | UBSAN_SANITIZE_test_ubsan.o := y | 75 | UBSAN_SANITIZE_test_ubsan.o := y |
| 77 | obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o | 76 | obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o |
| @@ -35,7 +35,7 @@ CFLAGS_shadow.o := $(CC_FLAGS_KASAN_RUNTIME) · 34 unmodified lines | |||
| 35 | CFLAGS_hw_tags.o := $(CC_FLAGS_KASAN_RUNTIME) | 35 | CFLAGS_hw_tags.o := $(CC_FLAGS_KASAN_RUNTIME) |
| 36 | CFLAGS_sw_tags.o := $(CC_FLAGS_KASAN_RUNTIME) | 36 | CFLAGS_sw_tags.o := $(CC_FLAGS_KASAN_RUNTIME) |
| 37 | 37 | ||
| 38 | CFLAGS_KASAN_TEST := $(CFLAGS_KASAN) $(call cc-disable-warning, vla) | 38 | CFLAGS_KASAN_TEST := $(CFLAGS_KASAN) |
| 39 | ifndef CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX | 39 | ifndef CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX |
| 40 | # If compiler instruments memintrinsics by prefixing them with __asan/__hwasan, | 40 | # If compiler instruments memintrinsics by prefixing them with __asan/__hwasan, |
| 41 | # we need to treat them normally (as builtins), otherwise the compiler won't | 41 | # we need to treat them normally (as builtins), otherwise the compiler won't |
| @@ -44,6 +44,7 @@ ifndef CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX · 2 unmodified lines | |||
| 44 | CFLAGS_KASAN_TEST += -fno-builtin | 44 | CFLAGS_KASAN_TEST += -fno-builtin |
| 45 | endif | 45 | endif |
| 46 | 46 | ||
| 47 | CFLAGS_REMOVE_kasan_test_c.o += $(call cc-option, -Wvla-larger-than=1) | ||
| 47 | CFLAGS_kasan_test_c.o := $(CFLAGS_KASAN_TEST) | 48 | CFLAGS_kasan_test_c.o := $(CFLAGS_KASAN_TEST) |
| 48 | RUSTFLAGS_kasan_test_rust.o := $(RUSTFLAGS_KASAN) | 49 | RUSTFLAGS_kasan_test_rust.o := $(RUSTFLAGS_KASAN) |
| 49 | 50 | ||
| @@ -45,8 +45,13 @@ endif · 44 unmodified lines | |||
| 45 | # These result in bogus false positives | 45 | # These result in bogus false positives |
| 46 | KBUILD_CFLAGS += $(call cc-disable-warning, dangling-pointer) | 46 | KBUILD_CFLAGS += $(call cc-disable-warning, dangling-pointer) |
| 47 | 47 | ||
| 48 | # Variable Length Arrays (VLAs) should not be used anywhere in the kernel | 48 | # Stack Variable Length Arrays (VLAs) must not be used in the kernel. |
| 49 | KBUILD_CFLAGS += -Wvla | 49 | # Function array parameters should, however, be usable, but -Wvla will |
| 50 | # warn for those. Clang has no way yet to distinguish between the VLA | ||
| 51 | # types, so depend on GCC for now to keep stack VLAs out of the tree. | ||
| 52 | # https://github.com/llvm/llvm-project/issues/57098 | ||
| 53 | # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98217 | ||
| 54 | KBUILD_CFLAGS += $(call cc-option,-Wvla-larger-than=1) | ||
| 50 | 55 | ||
| 51 | # disable pointer signed / unsigned warnings in gcc 4.0 | 56 | # disable pointer signed / unsigned warnings in gcc 4.0 |
| 52 | KBUILD_CFLAGS += -Wno-pointer-sign | 57 | KBUILD_CFLAGS += -Wno-pointer-sign |