Skip to content

Commit

Permalink
[clang] Disable check for system sanitizer blacklists files if -fno-s…
Browse files Browse the repository at this point in the history
…anitizer-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
  • Loading branch information
sylvain-audi committed Apr 30, 2020
1 parent 75a815a commit 2264897
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 16 deletions.
35 changes: 20 additions & 15 deletions clang/lib/Driver/SanitizerArgs.cpp
Expand Up @@ -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 {
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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,
Expand Down
10 changes: 9 additions & 1 deletion clang/test/Driver/fsanitize-blacklist.c
Expand Up @@ -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: {{^ *"}}

0 comments on commit 2264897

Please sign in to comment.