Messages in this thread | | | From | Dmitry Vyukov <> | Date | Tue, 5 May 2020 16:50:09 +0200 | Subject | Re: [PATCH] ubsan, kcsan: don't combine sanitizer with kcov |
| |
On Tue, May 5, 2020 at 4:36 PM Marco Elver <elver@google.com> wrote: > > Clang does not allow -fsanitize-coverage=trace-{pc,cmp} together > > with -fsanitize=bounds or with ubsan: > > > > clang: error: argument unused during compilation: '-fsanitize-coverage=trace-pc' [-Werror,-Wunused-command-line-argument] > > clang: error: argument unused during compilation: '-fsanitize-coverage=trace-cmp' [-Werror,-Wunused-command-line-argument] > > > > To avoid that case, add a Kconfig dependency. The dependency could > > go either way, disabling CONFIG_KCOV or CONFIG_UBSAN_BOUNDS when the > > other is set. I picked the second option here as this seems to have > > a smaller impact on the resulting kernel. > > > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > > --- > > lib/Kconfig.kcsan | 2 +- > > lib/Kconfig.ubsan | 1 + > > 2 files changed, 2 insertions(+), 1 deletion(-) > > > > diff --git a/lib/Kconfig.kcsan b/lib/Kconfig.kcsan > > index ea28245c6c1d..8f856c8828d5 100644 > > --- a/lib/Kconfig.kcsan > > +++ b/lib/Kconfig.kcsan > > @@ -5,7 +5,7 @@ config HAVE_ARCH_KCSAN > > > > menuconfig KCSAN > > bool "KCSAN: dynamic data race detector" > > - depends on HAVE_ARCH_KCSAN && DEBUG_KERNEL && !KASAN > > + depends on HAVE_ARCH_KCSAN && DEBUG_KERNEL && !KASAN && !KCOV > > This also disables KCOV with GCC. Why does this not work with KCSAN? > > This is a huge problem for us, since syzbot requires KCOV. In fact > I've always been building KCSAN kernels with CONFIG_KCOV=y (with GCC > or Clang) and cannot reproduce the problem. > > > select STACKTRACE > > help > > The Kernel Concurrency Sanitizer (KCSAN) is a dynamic > > diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan > > index 929211039bac..f98ef029553e 100644 > > --- a/lib/Kconfig.ubsan > > +++ b/lib/Kconfig.ubsan > > @@ -29,6 +29,7 @@ config UBSAN_TRAP > > config UBSAN_BOUNDS > > bool "Perform array index bounds checking" > > default UBSAN > > + depends on !(CC_IS_CLANG && KCOV) > > Ditto, we really need KCOV for all sanitizers. I also just tried to > reproduce the problem but can't. > > Which version of clang is causing this? I'm currently using Clang 9. > My guess is that we should not fix this by disallowing KCOV, but > rather make Clang work with these configs. > > Dmitry, can you comment?
FWIW I can reproduce both with clang:
$ clang /tmp/test.c -c -fsanitize-coverage=trace-pc -fsanitize=bounds clang-11: warning: argument unused during compilation: '-fsanitize-coverage=trace-pc' [-Wunused-command-line-argument]
$ clang /tmp/test.c -c -fsanitize-coverage=trace-pc -fsanitize=thread clang-11: warning: argument unused during compilation: '-fsanitize-coverage=trace-pc' [-Wunused-command-line-argument]
with both my disto's 9.0.1 and fresher 11.0.0 (7b80cb7cf45faf462d6193cc41c2cb7ad556600d.
But both work with gcc
$ gcc /tmp/test.c -c -fsanitize-coverage=trace-pc -fsanitize=thread $ gcc /tmp/test.c -c -fsanitize-coverage=trace-pc -fsanitize=bounds
Is it a known issue in clang?
Can we somehow disable it only for clang and not gcc?
This will immediately break KCSAN on syzbot as it enables KCSAN and KCOV: https://syzkaller.appspot.com/upstream?manager=ci2-upstream-kcsan-gce
| |