compiler_types.h: Attributes: Add __counted_by_ptr macro
Introduce __counted_by_ptr(), which works like __counted_by(), but for
pointer struct members.
struct foo {
int a, b, c;
char *buffer __counted_by_ptr(bytes);
short nr_bars;
struct bar *bars __counted_by_ptr(nr_bars);
size_t bytes;
};
Because "counted_by" can only be applied to pointer members in very
recent compiler versions, its application ends up needing to be distinct
from flexibe array "counted_by" annotations, hence a separate macro.
This is a reworking of Kees' previous patch [1].
Link: https://lore.kernel.org/all/20251020220118.1226740-1-kees@kernel.org/ [1]
Co-developed-by: Kees Cook <kees@kernel.org>
Signed-off-by: Bill Wendling <morbo@google.com>
Link: https://patch.msgid.link/20260116005838.2419118-1-morbo@google.com
Signed-off-by: Kees Cook <kees@kernel.org>
This commit is contained in:
parent
9f54ab83cb
commit
150a04d817
6
Makefile
6
Makefile
|
|
@ -952,6 +952,12 @@ KBUILD_CFLAGS += $(CC_AUTO_VAR_INIT_ZERO_ENABLER)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef CONFIG_CC_IS_CLANG
|
||||||
|
ifdef CONFIG_CC_HAS_COUNTED_BY_PTR
|
||||||
|
KBUILD_CFLAGS += -fexperimental-late-parse-attributes
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
# Explicitly clear padding bits during variable initialization
|
# Explicitly clear padding bits during variable initialization
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fzero-init-padding-bits=all)
|
KBUILD_CFLAGS += $(call cc-option,-fzero-init-padding-bits=all)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -369,7 +369,7 @@ struct ftrace_likely_data {
|
||||||
* Optional: only supported since clang >= 18
|
* Optional: only supported since clang >= 18
|
||||||
*
|
*
|
||||||
* gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896
|
* gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896
|
||||||
* clang: https://github.com/llvm/llvm-project/pull/76348
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#counted-by-counted-by-or-null-sized-by-sized-by-or-null
|
||||||
*
|
*
|
||||||
* __bdos on clang < 19.1.2 can erroneously return 0:
|
* __bdos on clang < 19.1.2 can erroneously return 0:
|
||||||
* https://github.com/llvm/llvm-project/pull/110497
|
* https://github.com/llvm/llvm-project/pull/110497
|
||||||
|
|
@ -383,6 +383,22 @@ struct ftrace_likely_data {
|
||||||
# define __counted_by(member)
|
# define __counted_by(member)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Runtime track number of objects pointed to by a pointer member for use by
|
||||||
|
* CONFIG_FORTIFY_SOURCE and CONFIG_UBSAN_BOUNDS.
|
||||||
|
*
|
||||||
|
* Optional: only supported since gcc >= 16
|
||||||
|
* Optional: only supported since clang >= 22
|
||||||
|
*
|
||||||
|
* gcc: https://gcc.gnu.org/pipermail/gcc-patches/2025-April/681727.html
|
||||||
|
* clang: https://clang.llvm.org/docs/AttributeReference.html#counted-by-counted-by-or-null-sized-by-sized-by-or-null
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_CC_HAS_COUNTED_BY_PTR
|
||||||
|
#define __counted_by_ptr(member) __attribute__((__counted_by__(member)))
|
||||||
|
#else
|
||||||
|
#define __counted_by_ptr(member)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Optional: only supported since gcc >= 15
|
* Optional: only supported since gcc >= 15
|
||||||
* Optional: not supported by Clang
|
* Optional: not supported by Clang
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,10 @@
|
||||||
#define __counted_by_be(m)
|
#define __counted_by_be(m)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __counted_by_ptr
|
||||||
|
#define __counted_by_ptr(m)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
#define __kernel_nonstring __nonstring
|
#define __kernel_nonstring __nonstring
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,13 @@ config CC_HAS_COUNTED_BY
|
||||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896
|
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896
|
||||||
default y if CC_IS_GCC && GCC_VERSION >= 150100
|
default y if CC_IS_GCC && GCC_VERSION >= 150100
|
||||||
|
|
||||||
|
config CC_HAS_COUNTED_BY_PTR
|
||||||
|
bool
|
||||||
|
# supported since clang 22
|
||||||
|
default y if CC_IS_CLANG && CLANG_VERSION >= 220000
|
||||||
|
# supported since gcc 16.0.0
|
||||||
|
default y if CC_IS_GCC && GCC_VERSION >= 160000
|
||||||
|
|
||||||
config CC_HAS_MULTIDIMENSIONAL_NONSTRING
|
config CC_HAS_MULTIDIMENSIONAL_NONSTRING
|
||||||
def_bool $(success,echo 'char tag[][4] __attribute__((__nonstring__)) = { };' | $(CC) $(CLANG_FLAGS) -x c - -c -o /dev/null -Werror)
|
def_bool $(success,echo 'char tag[][4] __attribute__((__nonstring__)) = { };' | $(CC) $(CLANG_FLAGS) -x c - -c -o /dev/null -Werror)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue