From 097477035d768beafce5a2b4d8742a1b7bea9a29 Mon Sep 17 00:00:00 2001 From: Hans-Erik Floryd Date: Mon, 25 Oct 2021 13:33:01 +0200 Subject: [PATCH] Fix address-of-packed-member warnings GCC9 introduced an address-of-packed-member warning that triggers in esc_coe.c. The issue is that a packed struct has an overall alignment of 1, and taking the address of a member in a packed struct is not guaranteed to have any particular alignment. However, in esc_coe these structs are always overlayed on aligned memory so in practice there is no problem. Fix the problem by explicitly setting the minimum alignment for the structs used in this manner. Also fix an instance where an unaligned pointer was used but never dereferenced (by changing the type of the pointer from uint32_t* to void*). --- soes/esc.h | 4 ++-- soes/esc_coe.c | 4 ++-- soes/include/sys/gcc/cc.h | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/soes/esc.h b/soes/esc.h index f6f4535..d3beed0 100644 --- a/soes/esc.h +++ b/soes/esc.h @@ -573,7 +573,7 @@ typedef struct CC_PACKED CC_PACKED_END CC_PACKED_BEGIN -typedef struct CC_PACKED +typedef struct CC_PACKED CC_ALIGNED(4) { _MBXh mbxheader; _COEh coeheader; @@ -585,7 +585,7 @@ typedef struct CC_PACKED CC_PACKED_END CC_PACKED_BEGIN -typedef struct CC_PACKED +typedef struct CC_PACKED CC_ALIGNED(4) { _MBXh mbxheader; _COEh coeheader; diff --git a/soes/esc_coe.c b/soes/esc_coe.c index 14b832a..851f8e1 100644 --- a/soes/esc_coe.c +++ b/soes/esc_coe.c @@ -1022,8 +1022,8 @@ static void SDO_downloadsegment (void) (coesdo->command & COE_TOGGLEBIT); /* copy toggle bit */ init_coesdo(coeres, COE_SDORESPONSE, command, 0, 0); - uint32_t *mbxdata = (uint32_t *)&(coesdo->index); /* data pointer */ - copy2mbx (mbxdata, (uint8_t *)ESCvar.data, size); + void *mbxdata = &(coesdo->index); /* data pointer */ + copy2mbx (mbxdata, ESCvar.data, size); if (coesdo->command & COE_COMMAND_LASTSEGMENTBIT) { diff --git a/soes/include/sys/gcc/cc.h b/soes/include/sys/gcc/cc.h index b3067b0..c4598bd 100644 --- a/soes/include/sys/gcc/cc.h +++ b/soes/include/sys/gcc/cc.h @@ -32,6 +32,7 @@ extern "C" #define CC_PACKED_BEGIN #define CC_PACKED_END #define CC_PACKED __attribute__((packed)) +#define CC_ALIGNED(n) __attribute__((aligned (n))) #ifdef __rtk__ #define CC_ASSERT(exp) ASSERT (exp)