diff options
| author | Kees Cook <kees@kernel.org> | 2026-02-20 13:15:58 -0800 |
|---|---|---|
| committer | Kees Cook <kees@kernel.org> | 2026-02-21 01:01:14 -0800 |
| commit | d39a1d7486d98668dd34aaa6732aad7977c45f5a (patch) | |
| tree | e3d0917dd485ceaca58f9c557550933a9acb2ab9 | |
| parent | d79526b89571ae447c1a5cfd3d627efa07098348 (diff) | |
compiler_types: Disable __builtin_counted_by_ref for Clang
Unfortunately, there is a corner case of __builtin_counted_by_ref()
usage that crashes[1] Clang since support was introduced in Clang 19.
Disable it prior to Clang 22. Found while tested kmalloc_obj treewide
refactoring (via kmalloc_flex() usage).
Link: https://github.com/llvm/llvm-project/issues/182575 [1]
Signed-off-by: Kees Cook <kees@kernel.org>
| -rw-r--r-- | include/linux/compiler_types.h | 3 | ||||
| -rw-r--r-- | init/Kconfig | 5 |
2 files changed, 7 insertions, 1 deletions
diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h index b1b141394d13..890076d0974b 100644 --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -552,7 +552,8 @@ struct ftrace_likely_data { * gcc: https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#index-_005f_005fbuiltin_005fcounted_005fby_005fref * clang: https://clang.llvm.org/docs/LanguageExtensions.html#builtin-counted-by-ref */ -#if __has_builtin(__builtin_counted_by_ref) +#if __has_builtin(__builtin_counted_by_ref) && \ + !defined(CONFIG_CC_HAS_BROKEN_COUNTED_BY_REF) /** * __flex_counter() - Get pointer to counter member for the given * flexible array, if it was annotated with __counted_by() diff --git a/init/Kconfig b/init/Kconfig index e95d43457851..c25869cf59c1 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -150,6 +150,11 @@ config CC_HAS_COUNTED_BY_PTR # supported since gcc 16.0.0 default y if CC_IS_GCC && GCC_VERSION >= 160000 +config CC_HAS_BROKEN_COUNTED_BY_REF + bool + # https://github.com/llvm/llvm-project/issues/182575 + default y if CC_IS_CLANG && CLANG_VERSION < 220000 + config CC_HAS_MULTIDIMENSIONAL_NONSTRING def_bool $(success,echo 'char tag[][4] __attribute__((__nonstring__)) = { };' | $(CC) $(CLANG_FLAGS) -x c - -c -o /dev/null -Werror) |
