mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-26 21:52:20 +00:00

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 9d7ca61b13
("lib/test_ubsan.c: VLA no longer used in kernel") so the lib/Makefile
disabling of VLA checking can be entirely removed.
Link: https://en.cppreference.com/w/c/language/array [1]
Link: https://github.com/llvm/llvm-project/issues/57098 [2]
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98217 [3]
Link: https://lore.kernel.org/lkml/7780883c-0ac8-4aaa-b850-469e33b50672@linux.ibm.com/ [4]
Link: https://lore.kernel.org/r/202505071331.4iOzqmuE-lkp@intel.com/ [5]
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Tested-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
Link: https://lore.kernel.org/r/20250418213235.work.532-kees@kernel.org
Signed-off-by: Kees Cook <kees@kernel.org>
62 lines
2.5 KiB
Makefile
62 lines
2.5 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
KASAN_SANITIZE := n
|
|
UBSAN_SANITIZE := n
|
|
KCOV_INSTRUMENT := n
|
|
|
|
# Disable ftrace to avoid recursion.
|
|
CFLAGS_REMOVE_common.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_generic.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_init.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_quarantine.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_report.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_report_generic.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_report_hw_tags.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_report_sw_tags.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_shadow.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_hw_tags.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_sw_tags.o = $(CC_FLAGS_FTRACE)
|
|
|
|
# Function splitter causes unnecessary splits in __asan_load1/__asan_store1
|
|
# see: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63533
|
|
CC_FLAGS_KASAN_RUNTIME := $(call cc-option, -fno-conserve-stack)
|
|
CC_FLAGS_KASAN_RUNTIME += -fno-stack-protector
|
|
# Disable branch tracing to avoid recursion.
|
|
CC_FLAGS_KASAN_RUNTIME += -DDISABLE_BRANCH_PROFILING
|
|
|
|
CFLAGS_common.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
CFLAGS_generic.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
CFLAGS_init.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
CFLAGS_quarantine.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
CFLAGS_report.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
CFLAGS_report_generic.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
CFLAGS_report_hw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
CFLAGS_report_sw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
CFLAGS_shadow.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
CFLAGS_hw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
CFLAGS_sw_tags.o := $(CC_FLAGS_KASAN_RUNTIME)
|
|
|
|
CFLAGS_KASAN_TEST := $(CFLAGS_KASAN)
|
|
ifndef CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX
|
|
# If compiler instruments memintrinsics by prefixing them with __asan/__hwasan,
|
|
# we need to treat them normally (as builtins), otherwise the compiler won't
|
|
# recognize them as instrumentable. If it doesn't instrument them, we need to
|
|
# pass -fno-builtin, so the compiler doesn't inline them.
|
|
CFLAGS_KASAN_TEST += -fno-builtin
|
|
endif
|
|
|
|
CFLAGS_REMOVE_kasan_test_c.o += $(call cc-option, -Wvla-larger-than=1)
|
|
CFLAGS_kasan_test_c.o := $(CFLAGS_KASAN_TEST)
|
|
RUSTFLAGS_kasan_test_rust.o := $(RUSTFLAGS_KASAN)
|
|
|
|
obj-y := common.o report.o
|
|
obj-$(CONFIG_KASAN_GENERIC) += init.o generic.o report_generic.o shadow.o quarantine.o
|
|
obj-$(CONFIG_KASAN_HW_TAGS) += hw_tags.o report_hw_tags.o tags.o report_tags.o
|
|
obj-$(CONFIG_KASAN_SW_TAGS) += init.o report_sw_tags.o shadow.o sw_tags.o tags.o report_tags.o
|
|
|
|
kasan_test-objs := kasan_test_c.o
|
|
ifdef CONFIG_RUST
|
|
kasan_test-objs += kasan_test_rust.o
|
|
endif
|
|
|
|
obj-$(CONFIG_KASAN_KUNIT_TEST) += kasan_test.o
|