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: {{^ *"}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits