From fb42a5a29202b8f71795385bec9965b06836d148 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Tue, 6 Jan 2015 01:31:23 +0000 Subject: [PATCH] [ubsan] partially enable -fsanitize-coverage=N with ubsan. It will work as usual in most cases but will not dump coverage on error with -fno-sanitize-recover (that'll be a separate fix) llvm-svn: 225234 --- compiler-rt/lib/ubsan/ubsan_init.cc | 1 + .../ubsan/TestCases/Misc/coverage-levels.cc | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 compiler-rt/test/ubsan/TestCases/Misc/coverage-levels.cc diff --git a/compiler-rt/lib/ubsan/ubsan_init.cc b/compiler-rt/lib/ubsan/ubsan_init.cc index 6080e304c122..dbafbac818a8 100644 --- a/compiler-rt/lib/ubsan/ubsan_init.cc +++ b/compiler-rt/lib/ubsan/ubsan_init.cc @@ -43,6 +43,7 @@ void __ubsan::InitIfNecessary() { // Initialize UBSan-specific flags. InitializeFlags(); SuppressionContext::InitIfNecessary(); + InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); ubsan_inited = true; } diff --git a/compiler-rt/test/ubsan/TestCases/Misc/coverage-levels.cc b/compiler-rt/test/ubsan/TestCases/Misc/coverage-levels.cc new file mode 100644 index 000000000000..02521722f611 --- /dev/null +++ b/compiler-rt/test/ubsan/TestCases/Misc/coverage-levels.cc @@ -0,0 +1,36 @@ +// Test various levels of coverage +// +// RUN: mkdir -p %T/coverage-levels +// RUN: OPT=coverage=1:verbosity=1:coverage_dir=%T/coverage-levels +// RUN: %clangxx -fsanitize=shift -DGOOD_SHIFT=1 -O1 -fsanitize-coverage=1 %s -o %t +// RUN: UBSAN_OPTIONS=$OPT ASAN_OPTIONS=$OPT %run %t 2>&1 | FileCheck %s --check-prefix=CHECK1 --check-prefix=CHECK_NOWARN +// RUN: %clangxx -fsanitize=undefined -DGOOD_SHIFT=1 -O1 -fsanitize-coverage=1 %s -o %t +// RUN: UBSAN_OPTIONS=$OPT ASAN_OPTIONS=$OPT %run %t 2>&1 | FileCheck %s --check-prefix=CHECK1 --check-prefix=CHECK_NOWARN + +// RUN: %clangxx -fsanitize=shift -O1 -fsanitize-coverage=1 %s -o %t +// RUN: UBSAN_OPTIONS=$OPT ASAN_OPTIONS=$OPT %run %t 2>&1 | FileCheck %s --check-prefix=CHECK1 --check-prefix=CHECK_WARN +// RUN: %clangxx -fsanitize=shift -O1 -fsanitize-coverage=2 %s -o %t +// RUN: UBSAN_OPTIONS=$OPT ASAN_OPTIONS=$OPT %run %t 2>&1 | FileCheck %s --check-prefix=CHECK2 --check-prefix=CHECK_WARN +// RUN: %clangxx -fsanitize=shift -O1 -fsanitize-coverage=3 %s -o %t +// RUN: UBSAN_OPTIONS=$OPT ASAN_OPTIONS=$OPT %run %t 2>&1 | FileCheck %s --check-prefix=CHECK3 --check-prefix=CHECK_WARN + +volatile int sink; +int main(int argc, char **argv) { + int shift = argc * 32; +#if GOOD_SHIFT + shift = 3; +#endif + if ((argc << shift) == 16) // False. + return 1; + return 0; +} + +// CHECK_WARN: shift exponent 32 is too large +// CHECK_NOWARN-NOT: ERROR +// FIXME: Currently, coverage instrumentation kicks in after ubsan, so we get +// more than the minimal number of instrumented blocks. +// FIXME: Currently, ubsan with -fno-sanitize-recover and w/o asan will fail +// to dump coverage. +// CHECK1: 1 PCs written +// CHECK2: 3 PCs written +// CHECK3: 4 PCs written