[v4] common/sfc: replace out of bounds condition with static_assert
Checks
Commit Message
The sfc base code had its own definition of static assertions
using the out of bound array access hack. Replace it with a
static_assert like rte_common.h.
The use of null pointer to compute offset is not always a constant
in older versions of clang. Use standard offsetof() instead.
Fixes: f67e4719147d ("net/sfc/base: fix coding style")
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Reviewed-by: Morten Brørup <mb@smartsharesystems.com>
---
drivers/common/sfc_efx/base/efx.h | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
Comments
On 2/12/2024 5:48 AM, Stephen Hemminger wrote:
> The sfc base code had its own definition of static assertions
> using the out of bound array access hack. Replace it with a
> static_assert like rte_common.h.
>
> The use of null pointer to compute offset is not always a constant
> in older versions of clang. Use standard offsetof() instead.
>
> Fixes: f67e4719147d ("net/sfc/base: fix coding style")> Cc: stable@dpdk.org
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> Acked-by: Morten Brørup <mb@smartsharesystems.com>
> Reviewed-by: Morten Brørup <mb@smartsharesystems.com>
>
Looks good to me,
unless there is no objection from driver maintainers I will merge it.
On 2/12/2024 5:48 AM, Stephen Hemminger wrote:
> The sfc base code had its own definition of static assertions
> using the out of bound array access hack. Replace it with a
> static_assert like rte_common.h.
>
> The use of null pointer to compute offset is not always a constant
> in older versions of clang. Use standard offsetof() instead.
>
> Fixes: f67e4719147d ("net/sfc/base: fix coding style")
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> Acked-by: Morten Brørup <mb@smartsharesystems.com>
> Reviewed-by: Morten Brørup <mb@smartsharesystems.com>
>
Moving ack from previous version:
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Applied to dpdk-next-net/main, thanks.
@@ -7,6 +7,8 @@
#ifndef _SYS_EFX_H
#define _SYS_EFX_H
+#include <assert.h>
+
#include "efx_annote.h"
#include "efsys.h"
#include "efx_types.h"
@@ -17,14 +19,20 @@
extern "C" {
#endif
-#define EFX_STATIC_ASSERT(_cond) \
- ((void)sizeof (char[(_cond) ? 1 : -1]))
+/*
+ * Triggers an error at compilation time if the condition is false.
+ *
+ * The { } exists to workaround a bug in clang (#55821)
+ * where it would not handle _Static_assert in a switch case.
+ */
+#define EFX_STATIC_ASSERT(_cond) \
+ { static_assert((_cond), #_cond); }
#define EFX_ARRAY_SIZE(_array) \
(sizeof (_array) / sizeof ((_array)[0]))
#define EFX_FIELD_OFFSET(_type, _field) \
- ((size_t)&(((_type *)0)->_field))
+ offsetof(_type, _field)
/* The macro expands divider twice */
#define EFX_DIV_ROUND_UP(_n, _d) (((_n) + (_d) - 1) / (_d))