From: George Karpenkov Date: Fri, 11 Aug 2017 17:22:58 +0000 (+0000) Subject: Add -fsanitize=fuzzer-no-link flag to the driver. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=078b7e8f1ede5ff43491f54ca8f9686c746cafb4;p=clang Add -fsanitize=fuzzer-no-link flag to the driver. The flag will perform instrumentation necessary to the fuzzing, but will NOT link libLLVMFuzzer.a library. Necessary when modifying CFLAGS for projects which may produce executables as well as a fuzzable target. Differential Revision: https://reviews.llvm.org/D36600 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@310733 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Sanitizers.def b/include/clang/Basic/Sanitizers.def index 28a92abf00..d6df617172 100644 --- a/include/clang/Basic/Sanitizers.def +++ b/include/clang/Basic/Sanitizers.def @@ -50,6 +50,9 @@ SANITIZER("memory", Memory) // libFuzzer SANITIZER("fuzzer", Fuzzer) +// libFuzzer-required instrumentation, no linking. +SANITIZER("fuzzer-no-link", FuzzerNoLink) + // ThreadSanitizer SANITIZER("thread", Thread) diff --git a/lib/Driver/SanitizerArgs.cpp b/lib/Driver/SanitizerArgs.cpp index 2f12c6d4a5..e411629ca4 100644 --- a/lib/Driver/SanitizerArgs.cpp +++ b/lib/Driver/SanitizerArgs.cpp @@ -32,7 +32,7 @@ enum : SanitizerMask { RequiresPIE = DataFlow, NeedsUnwindTables = Address | Thread | Memory | DataFlow, SupportsCoverage = Address | KernelAddress | Memory | Leak | Undefined | - Integer | Nullability | DataFlow | Fuzzer, + Integer | Nullability | DataFlow | Fuzzer | FuzzerNoLink, RecoverableByDefault = Undefined | Integer | Nullability, Unrecoverable = Unreachable | Return, LegacyFsanitizeRecoverMask = Undefined | Integer, @@ -286,8 +286,11 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, Add &= ~InvalidTrappingKinds; Add &= Supported; - // Enable coverage if the fuzzing flag is set. if (Add & Fuzzer) + Add |= FuzzerNoLink; + + // Enable coverage if the fuzzing flag is set. + if (Add & FuzzerNoLink) CoverageFeatures |= CoverageTracePCGuard | CoverageIndirCall | CoverageTraceCmp | CoveragePCTable; diff --git a/lib/Driver/ToolChains/Darwin.cpp b/lib/Driver/ToolChains/Darwin.cpp index 7f55d3ed7f..f67e36ef63 100644 --- a/lib/Driver/ToolChains/Darwin.cpp +++ b/lib/Driver/ToolChains/Darwin.cpp @@ -2018,6 +2018,7 @@ SanitizerMask Darwin::getSupportedSanitizers() const { Res |= SanitizerKind::Address; Res |= SanitizerKind::Leak; Res |= SanitizerKind::Fuzzer; + Res |= SanitizerKind::FuzzerNoLink; if (isTargetMacOS()) { if (!isMacosxVersionLT(10, 9)) Res |= SanitizerKind::Vptr; diff --git a/lib/Driver/ToolChains/Linux.cpp b/lib/Driver/ToolChains/Linux.cpp index 08a27fa7fe..1adf9f7070 100644 --- a/lib/Driver/ToolChains/Linux.cpp +++ b/lib/Driver/ToolChains/Linux.cpp @@ -828,6 +828,7 @@ SanitizerMask Linux::getSupportedSanitizers() const { SanitizerMask Res = ToolChain::getSupportedSanitizers(); Res |= SanitizerKind::Address; Res |= SanitizerKind::Fuzzer; + Res |= SanitizerKind::FuzzerNoLink; Res |= SanitizerKind::KernelAddress; Res |= SanitizerKind::Vptr; Res |= SanitizerKind::SafeStack; diff --git a/test/Driver/fuzzer.c b/test/Driver/fuzzer.c index 62ee06435c..c0fc4b6f66 100644 --- a/test/Driver/fuzzer.c +++ b/test/Driver/fuzzer.c @@ -21,6 +21,11 @@ // RUN: %clang -fsanitize=fuzzer %s -shared -o %t.so -### 2>&1 | FileCheck --check-prefixes=CHECK-NOLIB-SO %s // CHECK-NOLIB-SO-NOT: libLLVMFuzzer.a +// Check that we don't link in libFuzzer when compiling with -fsanitize=fuzzer-no-link. +// RUN: %clang -fsanitize=fuzzer-no-link %s -target x86_64-apple-darwin14 -### 2>&1 | FileCheck --check-prefixes=CHECK-NOLIB,CHECK-COV %s +// CHECK-NOLIB-NOT: libLLVMFuzzer.a +// CHECK-COV: -fsanitize-coverage-trace-pc-guard + // RUN: %clang -fsanitize=fuzzer -fsanitize-coverage=trace-pc %s -### 2>&1 | FileCheck --check-prefixes=CHECK-MSG %s // CHECK-MSG-NOT: argument unused during compilation