• Marc Kleine-Budde's avatar
    can: ems_usb: fix clang's -Wunaligned-access warning · a4cb6e62
    Marc Kleine-Budde authored
    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: 702171ad ("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: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    a4cb6e62
ems_usb.c 25.4 KB