Messages in this thread Patch in this message | | | From | Nick Desaulniers <> | Date | Thu, 17 Sep 2020 11:15:54 -0700 | Subject | Re: [PATCH] objtool: ignore unreachable trap after call to noreturn functions |
| |
On Thu, Sep 17, 2020 at 1:49 AM Ilie Halip <ilie.halip@gmail.com> wrote: > > With CONFIG_UBSAN_TRAP enabled, the compiler may insert a trap instruction > after a call to a noreturn function. In this case, objtool warns that the > ud2 instruction is unreachable. > > objtool silences similar warnings (trap after dead end instructions), so > expand that check to include dead end functions.
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Tested-by: Nick Desaulniers <ndesaulniers@google.com> Reported-by: kbuild test robot <lkp@intel.com>
Thanks for the patch, Ilie! With this, a defconfig+CONFIG_UBSAN+CONFIG_UBSAN_TRAP goes from 82 unreachable instruction warnings from objtool to 0.
$ make LLVM=1 -j71 defconfig $ make LLVM=1 -j71 menuconfig <enable UBSAN and UBSAN_TRAP> $ make LLVM=1 -j71 2> log.txt $ grep warning: log.txt | cut -d ' ' -f 2- | sort | uniq -c | wc -l 82 $ b4 am https://lore.kernel.org/lkml/20200917084905.1647262-1-ilie.halip@gmail.com/ -o - | git am $ make LLVM=1 -j71 clean $ make LLVM=1 -j71 2> log.txt $ grep warning: log.txt | cut -d ' ' -f 2- | sort | uniq -c | wc -l 0
> > Cc: Nick Desaulniers <ndesaulniers@google.com> > Cc: Rong Chen <rong.a.chen@intel.com> > Cc: Marco Elver <elver@google.com> > Cc: Philip Li <philip.li@intel.com> > Cc: Borislav Petkov <bp@alien8.de> > Cc: kasan-dev@googlegroups.com > Cc: x86@kernel.org > Cc: clang-built-linux@googlegroups.com > BugLink: https://github.com/ClangBuiltLinux/linux/issues/1148 > Link: https://lore.kernel.org/lkml/CAKwvOdmptEpi8fiOyWUo=AiZJiX+Z+VHJOM2buLPrWsMTwLnyw@mail.gmail.com > Suggested-by: Nick Desaulniers <ndesaulniers@google.com> > Signed-off-by: Ilie Halip <ilie.halip@gmail.com> > --- > tools/objtool/check.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/tools/objtool/check.c b/tools/objtool/check.c > index e034a8f24f46..eddf8bf16b05 100644 > --- a/tools/objtool/check.c > +++ b/tools/objtool/check.c > @@ -2612,9 +2612,10 @@ static bool is_ubsan_insn(struct instruction *insn) > "__ubsan_handle_builtin_unreachable")); > } > > -static bool ignore_unreachable_insn(struct instruction *insn) > +static bool ignore_unreachable_insn(struct objtool_file *file, struct instruction *insn) > { > int i; > + struct instruction *prev_insn; > > if (insn->ignore || insn->type == INSN_NOP) > return true; > @@ -2639,8 +2640,11 @@ static bool ignore_unreachable_insn(struct instruction *insn) > * __builtin_unreachable(). The BUG() macro has an unreachable() after > * the UD2, which causes GCC's undefined trap logic to emit another UD2 > * (or occasionally a JMP to UD2). > + * CONFIG_UBSAN_TRAP may also insert a UD2 after calling a __noreturn > + * function. > */ > - if (list_prev_entry(insn, list)->dead_end && > + prev_insn = list_prev_entry(insn, list); > + if ((prev_insn->dead_end || dead_end_function(file, prev_insn->call_dest)) && > (insn->type == INSN_BUG || > (insn->type == INSN_JUMP_UNCONDITIONAL && > insn->jump_dest && insn->jump_dest->type == INSN_BUG))) > @@ -2767,7 +2771,7 @@ static int validate_reachable_instructions(struct objtool_file *file) > return 0; > > for_each_insn(file, insn) { > - if (insn->visited || ignore_unreachable_insn(insn)) > + if (insn->visited || ignore_unreachable_insn(file, insn)) > continue; > > WARN_FUNC("unreachable instruction", insn->sec, insn->offset); > -- > 2.25.1 >
-- Thanks, ~Nick Desaulniers
| |