can: ems_usb: fix clang's -Wunaligned-access warning
authorMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 1 Aug 2022 20:47:16 +0000 (22:47 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 9 Aug 2022 07:05:06 +0000 (09:05 +0200)
clang emits a -Wunaligned-access warning on struct __packed
ems_cpc_msg.

The reason is that the anonymous union msg (not declared as packed) is
being packed right after some non naturally aligned variables (3*8
bits + 2*32) inside a packed struct:

| struct __packed ems_cpc_msg {
|  u8 type; /* type of message */
|  u8 length; /* length of data within union 'msg' */
|  u8 msgid; /* confirmation handle */
|  __le32 ts_sec; /* timestamp in seconds */
|  __le32 ts_nsec; /* timestamp in nano seconds */
| /* ^ not naturally aligned */
|
|  union {
|  /* ^ not declared as packed */
|  u8 generic[64];
|  struct cpc_can_msg can_msg;
|  struct cpc_can_params can_params;
|  struct cpc_confirm confirmation;
|  struct cpc_overrun overrun;
|  struct cpc_can_error error;
|  struct cpc_can_err_counter err_counter;
|  u8 can_state;
|  } msg;
| };

Starting from LLVM 14, having an unpacked struct nested in a packed
struct triggers a warning. c.f. [1].

Fix the warning by marking the anonymous union as packed.

[1] https://github.com/llvm/llvm-project/issues/55520

Fixes: 702171adeed3 ("ems_usb: Added support for EMS CPC-USB/ARM7 CAN/USB interface")
Link: https://lore.kernel.org/all/20220802094021.959858-1-mkl@pengutronix.de
Cc: Gerhard Uttenthaler <uttenthaler@ems-wuensche.com>
Cc: Sebastian Haas <haas@ems-wuensche.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/usb/ems_usb.c

index d1e1a459c0456bd8524647a6f5d5290de9383428..d31191686a549d3196aeac126c21ea51fb164dcc 100644 (file)
@@ -195,7 +195,7 @@ struct __packed ems_cpc_msg {
        __le32 ts_sec;  /* timestamp in seconds */
        __le32 ts_nsec; /* timestamp in nano seconds */
 
-       union {
+       union __packed {
                u8 generic[64];
                struct cpc_can_msg can_msg;
                struct cpc_can_params can_params;