On Tue, Apr 22, 2025 at 11:21:36AM -0600, Gustavo A. R. Silva wrote: > Add new STACK_FLEX_ARRAY_SIZE() helper to get the size of a > flexible-array member defined using DEFINE_FLEX()/DEFINE_RAW_FLEX() > at compile time. > > This is essentially the same as ARRAY_SIZE() but for on-stack > flexible-array members. > > Signed-off-by: Gustavo A. R. Silva <gustavo...@kernel.org> > --- > include/linux/overflow.h | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/include/linux/overflow.h b/include/linux/overflow.h > index 6ee67c20b575..5b2e0cc9aba2 100644 > --- a/include/linux/overflow.h > +++ b/include/linux/overflow.h > @@ -420,6 +420,7 @@ static inline size_t __must_check size_sub(size_t > minuend, size_t subtrahend) > * flexible array member. > * Use __struct_size(@name) to get compile-time size of it afterwards. > * Use __member_size(@name->member) to get compile-time size of @name > members. > + * Use STACK_FLEX_ARRAY_SIZE(@name, @member) to get compile-time size of > array @member.
Instead of "size of" how about "number of elements in" > */ > #define DEFINE_RAW_FLEX(type, name, member, count) \ > _DEFINE_FLEX(type, name, member, count, = {}) > @@ -438,8 +439,20 @@ static inline size_t __must_check size_sub(size_t > minuend, size_t subtrahend) > * flexible array member. > * Use __struct_size(@NAME) to get compile-time size of it afterwards. > * Use __member_size(@NAME->member) to get compile-time size of @NAME > members. > + * Use STACK_FLEX_ARRAY_SIZE(@name, @member) to get compile-time size of > array @member. Same here. > */ > #define DEFINE_FLEX(TYPE, NAME, MEMBER, COUNTER, COUNT) \ > _DEFINE_FLEX(TYPE, NAME, MEMBER, COUNT, = { .obj.COUNTER = COUNT, }) > > +/** > + * STACK_FLEX_ARRAY_SIZE() - helper macro for DEFINE_FLEX() family. > + * Returns the number of elements in @array. Which matches these docs. > + * > + * @name: Name for a variable defined in DEFINE_RAW_FLEX()/DEFINE_FLEX(). > + * @array: Name of the array member. > + */ > +#define STACK_FLEX_ARRAY_SIZE(name, array) > \ > + (__member_size((name)->array) / sizeof(*(name)->array) + > \ > + __must_be_array((name)->array)) > + > #endif /* __LINUX_OVERFLOW_H */ > -- > 2.43.0 > -- Kees Cook