x86/boot/tboot: Avoid Wstringop-overread-warning
authorArnd Bergmann <arnd@arndb.de>
Mon, 22 Mar 2021 16:02:40 +0000 (17:02 +0100)
committerIngo Molnar <mingo@kernel.org>
Mon, 22 Mar 2021 23:16:13 +0000 (00:16 +0100)
commitcdc34cb8f25d3125d30868376b8eae6fe690119b
tree7dae140477c48a8d51d80abded4f1c998713efeb
parent84196390620ac0e5070ae36af84c137c6216a7dc
x86/boot/tboot: Avoid Wstringop-overread-warning

gcc-11 warns about using string operations on pointers that are
defined at compile time as offsets from a NULL pointer. Unfortunately
that also happens on the result of fix_to_virt(), which is a
compile-time constant for a constant input:

  arch/x86/kernel/tboot.c: In function 'tboot_probe':
  arch/x86/kernel/tboot.c:70:13: error: '__builtin_memcmp_eq' specified bound 16 exceeds source size 0 [-Werror=stringop-overread]
     70 |         if (memcmp(&tboot_uuid, &tboot->uuid, sizeof(tboot->uuid))) {
        |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

I hope this can get addressed in gcc-11 before the release.

As a workaround, split up the tboot_probe() function in two halves
to separate the pointer generation from the usage. This is a bit
ugly, and hopefully gcc understands that the code is actually correct
before it learns to peek into the noinline function.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Martin Sebor <msebor@gmail.com>
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578
Link: https://lore.kernel.org/r/20210322160253.4032422-3-arnd@kernel.org
arch/x86/kernel/tboot.c