From 20a460fabf48f6c97faa61736f67bbcd072f603b Mon Sep 17 00:00:00 2001 From: Kirill Kolyshkin Date: Sun, 1 Oct 2017 13:43:22 -0700 Subject: [PATCH] Silence clang-4 warning about unaligned pointer This is what we have: > compel/src/lib/infect.c:1145:38: error: taking address of packed member > 'uc_sigmask' of class or structure 'ucontext_ia32' may result in an > unaligned pointer value [-Werror,-Waddress-of-packed-member] > blk_sigset = RT_SIGFRAME_UC_SIGMASK(f); > ~~~~~~~~~~~~~~~~~~~~~~~^~ > compel/include/uapi/asm/sigframe.h:133:4: note: expanded from macro > 'RT_SIGFRAME_UC_SIGMASK' > (&rt_sigframe->compat.uc.uc_sigmask)) > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > 1 error generated. Indeed this results in an unaligned pointer, but as this is intended and well known (see commit dd6736bd "compel/x86/compat: pack ucontext_ia32"), we need to silence the warning here. For more details, see https://reviews.llvm.org/D20561 Originally found by Travis on Alpine Linux, reproduced on Ubuntu 17.10. [v2: fix for non-x86] Reported-by: Andrei Vagin Signed-off-by: Kir Kolyshkin Signed-off-by: Andrei Vagin --- compel/arch/x86/src/lib/include/uapi/asm/sigframe.h | 2 +- compel/src/lib/infect.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compel/arch/x86/src/lib/include/uapi/asm/sigframe.h b/compel/arch/x86/src/lib/include/uapi/asm/sigframe.h index 2b51c3666..3260d9c16 100644 --- a/compel/arch/x86/src/lib/include/uapi/asm/sigframe.h +++ b/compel/arch/x86/src/lib/include/uapi/asm/sigframe.h @@ -130,7 +130,7 @@ struct rt_sigframe { #define RT_SIGFRAME_UC_SIGMASK(rt_sigframe) \ ((rt_sigframe->is_native) ? \ (&rt_sigframe->native.uc.uc_sigmask) : \ - (&rt_sigframe->compat.uc.uc_sigmask)) + ((k_rtsigset_t *)(void *)&rt_sigframe->compat.uc.uc_sigmask)) #define RT_SIGFRAME_REGIP(rt_sigframe) \ ((rt_sigframe->is_native) ? \ diff --git a/compel/src/lib/infect.c b/compel/src/lib/infect.c index 07200a7a6..9ebc5b5ac 100644 --- a/compel/src/lib/infect.c +++ b/compel/src/lib/infect.c @@ -1126,7 +1126,7 @@ static int save_regs_plain(void *to, user_regs_struct_t *r, user_fpregs_struct_t #ifndef RT_SIGFRAME_UC_SIGMASK #define RT_SIGFRAME_UC_SIGMASK(sigframe) \ - (k_rtsigset_t*)&RT_SIGFRAME_UC(sigframe)->uc_sigmask + (k_rtsigset_t*)(void *)&RT_SIGFRAME_UC(sigframe)->uc_sigmask #endif static int make_sigframe_plain(void *from, struct rt_sigframe *f, struct rt_sigframe *rtf, k_rtsigset_t *b)