> From: Stephen Hemminger [mailto:step...@networkplumber.org] > Sent: Thursday, 9 June 2022 00.49 > > Gcc 12 adds more array bounds checking (good); but it is not smart > enough to realize that for small fixed sizes, the bigger move options > are not used. > > An example is using rte_memcpy() on a RSS key of 40 bytes may trigger > rte_memcpy complaints from rte_mov128 reading past end of input. > > In order to keep some of the checks add special case for calls > to rte_memcpy() with fixed size arguments to use the compiler > builtin instead. Don't want to give all the checking for > code that uses rte_memcpy() everywhere. > > Signed-off-by: Stephen Hemminger <step...@networkplumber.org> > --- > lib/eal/x86/include/rte_memcpy.h | 16 +++++++++++----- > 1 file changed, 11 insertions(+), 5 deletions(-) > > diff --git a/lib/eal/x86/include/rte_memcpy.h > b/lib/eal/x86/include/rte_memcpy.h > index 18aa4e43a743..b90cdd8d7326 100644 > --- a/lib/eal/x86/include/rte_memcpy.h > +++ b/lib/eal/x86/include/rte_memcpy.h > @@ -27,6 +27,10 @@ extern "C" { > #pragma GCC diagnostic ignored "-Wstringop-overflow" > #endif > > +#if defined(RTE_TOOLCHAIN_GCC) && (GCC_VERSION >= 120000) > +#pragma GCC diagnostic ignored "-Warray-bounds" > +#endif > + > /** > * Copy bytes from one location to another. The locations must not > overlap. > * > @@ -842,19 +846,21 @@ rte_memcpy_aligned(void *dst, const void *src, > size_t n) > return ret; > } > > +#if defined(RTE_TOOLCHAIN_GCC) && (GCC_VERSION >= 100000) > +#pragma GCC diagnostic pop > +#endif > + > static __rte_always_inline void * > rte_memcpy(void *dst, const void *src, size_t n) > { > - if (!(((uintptr_t)dst | (uintptr_t)src) & ALIGNMENT_MASK)) > + if (__builtin_constant_p(n)) > + return __builtin_memcpy(dst, src, n); > + else if (!(((uintptr_t)dst | (uintptr_t)src) & ALIGNMENT_MASK)) > return rte_memcpy_aligned(dst, src, n); > else > return rte_memcpy_generic(dst, src, n); > } > > -#if defined(RTE_TOOLCHAIN_GCC) && (GCC_VERSION >= 100000) > -#pragma GCC diagnostic pop > -#endif > - > #ifdef __cplusplus > } > #endif > -- > 2.35.1 >
Very good. Reviewed-by: Morten Brørup <m...@smartsharesystems.com> While you are at it, would you consider concealing the definition of ALIGNMENT_MASK too? It seems to be leaking out from this header file.