On Tue, Jul 14, 2026 at 11:18:18AM -0400, Jesse Taube wrote: > Add new DECLARE_SIZED_FLEX() helper to set the default size of a > flexible-array member. The code is identical to the declaration in > __DEFINE_FLEX() which has also been changed to use DECLARE_SIZED_FLEX(). > > Add DECLARE_COUNTED_FLEX_ARRAY() helper which is a variant of > DECLARE_FLEX_ARRAY() with a counted-by attribute. > > Also add default sized variants of > DECLARE_FLEX_ARRAY(), DECLARE_SIZED_FLEX(), and > DECLARE_COUNTED_FLEX_ARRAY(), DECLARE_COUNTED_SIZED_FLEX().
Where do you want to use these new helpers? > Signed-off-by: Jesse Taube <[email protected]> > --- > include/linux/overflow.h | 58 +++++++++++++++++++++++++++++++++++++--- > 1 file changed, 54 insertions(+), 4 deletions(-) > > diff --git a/include/linux/overflow.h b/include/linux/overflow.h > index a8cb6319b4fb..a3384cae49e5 100644 > --- a/include/linux/overflow.h > +++ b/include/linux/overflow.h > @@ -464,6 +464,59 @@ static __always_inline size_t __must_check > size_sub(size_t minuend, size_t subtr > */ > #define struct_offset(p, member) (offsetof(typeof(*(p)), member)) > > +/** > + * __DECLARE_SIZED_FLEX() - helper macro for DECLARE_SIZED_FLEX() family. > + * Allows for easily declaring a structure with a trailing flexible array > member > + * to have a specific size. > + * > + * @obj: object to be given a specific size > + * @name: Name of the array member. > + * @count: Number of elements in the array; must be compile-time const. > + */ > +#define __DECLARE_SIZED_FLEX(obj, name, count) \ > + _Static_assert(__builtin_constant_p(count), \ > + "default sized flex array members require compile-time > const count"); \ > + union { \ > + u8 bytes[struct_size_t(obj, name, count)]; \ > + obj; \ > + } > + > +/** > + * DECLARE_COUNTED_FLEX_ARRAY() - Declare a counted flexible array > + * > + * @type: Type name. > + * @name: Name of the array member. > + * @counter: Name of the __counted_by member. > + */ > +#define DECLARE_COUNTED_FLEX_ARRAY(type, name, counter)\ > + struct { \ > + size_t counter; \ > + type name[] __counted_by(counter); \ > + } > + > +/** > + * DECLARE_SIZED_FLEX() - Declare a structure with a trailing flexible array > + * member with a default size. > + * > + * @type: Type name. > + * @name: Name of the array member. > + * @count: Number of elements in the array; must be compile-time const. > + */ > +#define DECLARE_SIZED_FLEX(type, name, count) \ > + __DECLARE_SIZED_FLEX(type name[], name, count) > + > +/** > + * DECLARE_COUNTED_SIZED_FLEX() - Declare a structure with a trailing > flexible > + * array member counted by count, with a default size. > + * > + * @type: Type name. > + * @name: Name of the array member. > + * @counter: Name of the __counted_by member. > + * @count: Number of elements in the array; must be compile-time const. > + */ > +#define DECLARE_COUNTED_SIZED_FLEX(type, name, counter, count) \ > + __DECLARE_SIZED_FLEX(DECLARE_COUNTED_FLEX_ARRAY(type, name, counter), > name, count) I ask about where these will be used because one of the things I want to keep tied together is the "counter" and "count", which usually means the declaration should be combined with an initializer in some way so that the counter gets assigned, as DEFINE_FLEX() ultimately does. I'm worried that extracting the internal construction of __DEFINE_FLEX means we may run the risk of increasing the risk of losing that tie. So, I'd love to understand how you want to use this, as that would help my understanding and potentially shape the design so we can keep counter and count strongly associated. > + > /** > * __DEFINE_FLEX() - helper macro for DEFINE_FLEX() family. > * Enables caller macro to pass arbitrary trailing expressions > @@ -477,10 +530,7 @@ static __always_inline size_t __must_check > size_sub(size_t minuend, size_t subtr > #define __DEFINE_FLEX(type, name, member, count, trailer...) > \ > _Static_assert(__builtin_constant_p(count), > \ > "onstack flex array members require compile-time const > count"); \ > - union { > \ > - u8 bytes[struct_size_t(type, member, count)]; > \ > - type obj; > \ > - } name##_u trailer; > \ > + __DECLARE_SIZED_FLEX(type obj, member, count) name##_u trailer; > \ > type *name = (type *)&name##_u -Kees -- Kees Cook

