[clang] 2264897 - [clang] Disable check for system sanitizer blacklists files if -fno-sanitizer-blacklist was specified
Sylvain Audi via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 30 13:11:51 PDT 2020
Author: Sylvain Audi
Date: 2020-04-30T16:04:50-04:00
New Revision: 226489715cb892993ce36f62845867aa9100e6d1
URL: https://github.com/llvm/llvm-project/commit/226489715cb892993ce36f62845867aa9100e6d1
DIFF: https://github.com/llvm/llvm-project/commit/226489715cb892993ce36f62845867aa9100e6d1.diff
LOG: [clang] Disable check for system sanitizer blacklists files if -fno-sanitizer-blacklist was specified
This is to avoid checking for the validity of a file that is not used.
This also contains a minor fix for the test, as the cfi sanitizer requires -flto and -fvisibility= arguments.
Differential Revision: https://reviews.llvm.org/D79043
Added:
Modified:
clang/lib/Driver/SanitizerArgs.cpp
clang/test/Driver/fsanitize-blacklist.c
Removed:
################################################################################
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 806cf6214a38..c7760f086284 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -117,6 +117,19 @@ static std::string describeSanitizeArg(const llvm::opt::Arg *A,
/// Sanitizers set.
static std::string toString(const clang::SanitizerSet &Sanitizers);
+static void validateSpecialCaseListFormat(const Driver &D,
+ std::vector<std::string> &SCLFiles,
+ unsigned MalformedSCLErrorDiagID) {
+ if (SCLFiles.empty())
+ return;
+
+ std::string BLError;
+ std::unique_ptr<llvm::SpecialCaseList> SCL(
+ llvm::SpecialCaseList::create(SCLFiles, D.getVFS(), BLError));
+ if (!SCL.get())
+ D.Diag(MalformedSCLErrorDiagID) << BLError;
+}
+
static void addDefaultBlacklists(const Driver &D, SanitizerMask Kinds,
std::vector<std::string> &BlacklistFiles) {
struct Blacklist {
@@ -147,6 +160,8 @@ static void addDefaultBlacklists(const Driver &D, SanitizerMask Kinds,
// should fail.
D.Diag(clang::diag::err_drv_no_such_file) << Path;
}
+ validateSpecialCaseListFormat(
+ D, BlacklistFiles, clang::diag::err_drv_malformed_sanitizer_blacklist);
}
/// Parse -f(no-)?sanitize-(coverage-)?(white|black)list argument's values,
@@ -173,14 +188,7 @@ static void parseSpecialCaseListArg(const Driver &D,
SCLFiles.clear();
}
}
- // Validate special case list format.
- {
- std::string BLError;
- std::unique_ptr<llvm::SpecialCaseList> SCL(
- llvm::SpecialCaseList::create(SCLFiles, D.getVFS(), BLError));
- if (!SCL.get())
- D.Diag(MalformedSCLErrorDiagID) << BLError;
- }
+ validateSpecialCaseListFormat(D, SCLFiles, MalformedSCLErrorDiagID);
}
/// Sets group bits for every group that has at least one representative already
@@ -566,16 +574,13 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
RecoverableKinds &= ~TrappingKinds;
// Setup blacklist files.
- // Add default blacklist from resource directory.
- addDefaultBlacklists(D, Kinds, SystemBlacklistFiles);
+ // Add default blacklist from resource directory for activated sanitizers, and
+ // validate special case lists format.
+ if (!Args.hasArgNoClaim(options::OPT_fno_sanitize_blacklist))
+ addDefaultBlacklists(D, Kinds, SystemBlacklistFiles);
// Parse -f(no-)?sanitize-blacklist options.
// This also validates special case lists format.
- // Here, OptSpecifier() acts as a never-matching command-line argument.
- // So, there is no way to append to system blacklist but it can be cleared.
- parseSpecialCaseListArg(D, Args, SystemBlacklistFiles, OptSpecifier(),
- options::OPT_fno_sanitize_blacklist,
- clang::diag::err_drv_malformed_sanitizer_blacklist);
parseSpecialCaseListArg(D, Args, UserBlacklistFiles,
options::OPT_fsanitize_blacklist,
options::OPT_fno_sanitize_blacklist,
diff --git a/clang/test/Driver/fsanitize-blacklist.c b/clang/test/Driver/fsanitize-blacklist.c
index 2d3ef3f6eee7..254421cc34be 100644
--- a/clang/test/Driver/fsanitize-blacklist.c
+++ b/clang/test/Driver/fsanitize-blacklist.c
@@ -59,8 +59,16 @@
// CHECK-ONLY-FIRST-DISABLED: -fsanitize-blacklist={{.*}}.second
// CHECK-ONLY_FIRST-DISABLED-NOT: good
+// -fno-sanitize-blacklist disables the system blacklists.
+// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fno-sanitize-blacklist %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DISABLED-SYSTEM --check-prefix=DELIMITERS
+// CHECK-DISABLED-SYSTEM-NOT: -fsanitize-system-blacklist
+
// If cfi_blacklist.txt cannot be found in the resource dir, driver should fail.
-// RUN: %clang -target x86_64-linux-gnu -fsanitize=cfi -resource-dir=/dev/null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MISSING-CFI-BLACKLIST
+// RUN: %clang -target x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=default -resource-dir=/dev/null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MISSING-CFI-BLACKLIST
// CHECK-MISSING-CFI-BLACKLIST: error: no such file or directory: '{{.*}}cfi_blacklist.txt'
+// -fno-sanitize-blacklist disables checking for cfi_blacklist.txt in the resource dir.
+// RUN: %clang -target x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=default -fno-sanitize-blacklist -resource-dir=/dev/null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MISSING-CFI-NO-BLACKLIST
+// CHECK-MISSING-CFI-NO-BLACKLIST-NOT: error: no such file or directory: '{{.*}}cfi_blacklist.txt'
+
// DELIMITERS: {{^ *"}}
More information about the cfe-commits
mailing list