Re: [BUG] Argument-alignment build error with clang
From: Ard Biesheuvel
Date: Wed Oct 23 2024 - 18:40:31 EST
(cc Dan, Nathan)
On Thu, 24 Oct 2024 at 00:26, Paul E. McKenney <paulmck@xxxxxxxxxx> wrote:
>
> Hello!
>
> Running rcutorture on next-20241023 got me lots of these:
>
> drivers/acpi/prmt.c:156:29: error: passing 1-byte aligned argument to 4-byte aligned parameter 1 of 'efi_pa_va_lookup' may result in an unaligned pointer access [-Werror,-Walign-mismatch]
> 156 | (void *)efi_pa_va_lookup(&th->guid, handler_info->handler_address);
>
> This is built with CC=clang. I don't see this diagnostic with GCC.
> But we are supposed to be able to build with clang, so...
>
> The first argument is the address of one of these:
>
> typedef struct {
> __u8 b[UUID_SIZE];
> } guid_t;
>
> Where UUID_SIZE is as follows:
>
> #define UUID_SIZE 16
>
> But this guid_t is a member of one of these:
>
> struct prm_handler_info {
> guid_t guid;
> efi_status_t (__efiapi *handler_addr)(u64, void *);
> u64 static_data_buffer_addr;
> u64 acpi_param_buffer_addr;
>
> struct list_head handler_list;
> };
>
> One can argue that this structure must be 16-bit aligned on a
> 64-bit build. So maybe this is a bug in clang's diagnostics, hence
> linux-toolchains on CC.
>
> Thoughts?
>
Also discussed here:
https://lore.kernel.org/all/CAMj1kXFXimHaGdeDBH3fOzuBiVcATA+JNpGqDs+m5h=8M_g+yA@xxxxxxxxxxxxxx/T/#u
I agree that this looks like a spurious warning. Even if the alignment
of the type is only 1 byte, the fact that it appears at the start of a
8-byte aligned non-packed struct guarantees sufficient alignment for
this particular use of the type.