lkml.org 
[lkml]   [2022]   [Aug]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 070/101] can: ems_usb: fix clangs -Wunaligned-access warning
    Date
    From: Marc Kleine-Budde <mkl@pengutronix.de>

    commit a4cb6e62ea4d36e53fb3c0f18ea4503d7b76674f upstream.

    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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/can/usb/ems_usb.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/drivers/net/can/usb/ems_usb.c
    +++ b/drivers/net/can/usb/ems_usb.c
    @@ -206,7 +206,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;

    \
     
     \ /
      Last update: 2022-08-23 10:33    [W:8.997 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site