Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | Date | Mon, 18 Mar 2024 17:00:33 -0600 | From | "Gustavo A. R. Silva" <> | Subject | [PATCH][next] stddef: Introduce struct_group_tagged_attr() helper macro |
| |
We need a new `struct_group()` helper that allows for both having the struct be tagged, and specifying struct attributes like `__packed` or `__align(x)`.
This new helper will initially be used to address -Wflex-array-member-not-at-end warnings, where a tagged struct is used to separate the flexible-array member from the rest of the members in the flexible structure [1]. There are some scenarios in which those members need to be packed, as well.
So, `struct_group_tagged_attr()` is introduced for this.
Link: https://lore.kernel.org/linux-hardening/ZeIgeZ5Sb0IZTOyt@neat/ [1] Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org> --- include/linux/stddef.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/include/linux/stddef.h b/include/linux/stddef.h index 929d67710cc5..919df9453257 100644 --- a/include/linux/stddef.h +++ b/include/linux/stddef.h @@ -80,6 +80,26 @@ enum { #define struct_group_tagged(TAG, NAME, MEMBERS...) \ __struct_group(TAG, NAME, /* no attrs */, MEMBERS) +/** + * struct_group_tagged_attr() - Create a struct_group with a reusable + * tag and trailing attributes. + * + * @TAG: The tag name for the named sub-struct + * @NAME: The identifier name of the mirrored sub-struct + * @ATTRS: Any struct attributes to apply + * @MEMBERS: The member declarations for the mirrored structs + * + * Used to create an anonymous union of two structs with identical + * layout and size: one anonymous and one named. The former can be + * used normally without sub-struct naming, and the latter can be + * used to reason about the start, end, and size of the group of + * struct members. Includes struct tag argument for the named copy, + * so the specified layout can be reused later. Also includes + * structure attributes argument. + */ +#define struct_group_tagged_attr(TAG, NAME, ATTRS, MEMBERS...) \ + __struct_group(TAG, NAME, ATTRS, MEMBERS) + /** * DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union * -- 2.34.1
| ![\](/images/icornerr.gif) |