RE: [PATCH v15 1/2] eal: add __rte_may_alias to unaligned typedefs

Morten Brørup
2026-01-20T15:23:14Z

> From: scott.k.mitch1@gmail.com [mailto:scott.k.mitch1@gmail.com]
> Sent: Saturday, 17 January 2026 22.21
> To: dev@dpdk.org
> Cc: Morten Brørup; stephen@networkplumber.org; Scott Mitchell
> Subject: [PATCH v15 1/2] eal: add __rte_may_alias to unaligned typedefs
>
> From: Scott Mitchell <scott.k.mitch1@gmail.com>
>
> Add __rte_may_alias attribute to unaligned_uint{16,32,64}_t typedefs
> to prevent GCC strict-aliasing optimization bugs. GCC has a bug where
> it incorrectly elides struct initialization when strict aliasing is
> enabled, causing reads from uninitialized memory.
>
> The __rte_may_alias attribute signals to the compiler that these types
> can alias other types, preventing the incorrect optimization.

Although this is a workaround to fix bugs in GCC, and not DPDK itself,
I think it should be backported.
It may fix (GCC induced) bugs in applications using these types.
That's my opinion; let's get more opinions.

If so, add:

Fixes: 7621d6a8d0bd ("eal: add and use unaligned integer types")

>
> Signed-off-by: Scott Mitchell <scott.k.mitch1@gmail.com>
> ---
> lib/eal/include/rte_common.h | 34 +++++++++++++++++++---------------
> 1 file changed, 19 insertions(+), 15 deletions(-)
>
> diff --git a/lib/eal/include/rte_common.h
> b/lib/eal/include/rte_common.h
> index 9e7d84f929..ac70270cfb 100644
> --- a/lib/eal/include/rte_common.h
> +++ b/lib/eal/include/rte_common.h
> @@ -121,14 +121,27 @@ extern "C" {
> #define __rte_aligned(a) __attribute__((__aligned__(a)))
> #endif
>
> +/**
> + * Macro to mark a type that is not subject to type-based aliasing
> rules
> + */
> +#ifdef RTE_TOOLCHAIN_MSVC
> +#define __rte_may_alias
> +#else
> +#define __rte_may_alias __attribute__((__may_alias__))
> +#endif
> +
> +/**
> + * __rte_may_alias avoids compiler bugs (GCC) that elide
> initialization
> + * of memory when strict-aliasing is enabled.
> + */
> #ifdef RTE_ARCH_STRICT_ALIGN
> -typedef uint64_t unaligned_uint64_t __rte_aligned(1);
> -typedef uint32_t unaligned_uint32_t __rte_aligned(1);
> -typedef uint16_t unaligned_uint16_t __rte_aligned(1);
> +typedef uint64_t unaligned_uint64_t __rte_may_alias __rte_aligned(1);
> +typedef uint32_t unaligned_uint32_t __rte_may_alias __rte_aligned(1);
> +typedef uint16_t unaligned_uint16_t __rte_may_alias __rte_aligned(1);
> #else
> -typedef uint64_t unaligned_uint64_t;
> -typedef uint32_t unaligned_uint32_t;
> -typedef uint16_t unaligned_uint16_t;
> +typedef uint64_t unaligned_uint64_t __rte_may_alias;
> +typedef uint32_t unaligned_uint32_t __rte_may_alias;
> +typedef uint16_t unaligned_uint16_t __rte_may_alias;
> #endif
>
> /**
> @@ -159,15 +172,6 @@ typedef uint16_t unaligned_uint16_t;
> #define __rte_packed_end __attribute__((__packed__))
> #endif
>
> -/**
> - * Macro to mark a type that is not subject to type-based aliasing
> rules
> - */
> -#ifdef RTE_TOOLCHAIN_MSVC
> -#define __rte_may_alias
> -#else
> -#define __rte_may_alias __attribute__((__may_alias__))
> -#endif
> -
> /******* Macro to mark functions and fields scheduled for removal
> *****/
> #ifdef RTE_TOOLCHAIN_MSVC
> #define __rte_deprecated
> --
> 2.39.5 (Apple Git-154)