[clang] 03b84e4 - [clang] Report sanitizer blacklist as a dependency in cc1
Jan Korous via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 8 10:55:13 PST 2019
Hi Matthew,
Are you sure it is this commit? It is definitely possible yet sounds a bit unlikely that my patch would cause linker errors.
Anyway, I am going to reproduce on a linux box.
Thanks.
Jan
> On Nov 7, 2019, at 4:50 PM, Voss, Matthew <Matthew.Voss at sony.com> wrote:
>
> Hi Jan,
>
> It looks like this commit is causing DFSAN failures on the sanitizer bots and our internal CI. Could you take a look?
>
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/24312/steps/64-bit%20check-dfsan/logs/stdio
>
> Thanks,
> Matthew
>
>> -----Original Message-----
>> From: cfe-commits <cfe-commits-bounces at lists.llvm.org> On Behalf Of Jan
>> Korous via cfe-commits
>> Sent: Thursday, November 7, 2019 2:07 PM
>> To: cfe-commits at lists.llvm.org
>> Subject: [clang] 03b84e4 - [clang] Report sanitizer blacklist as a
>> dependency in cc1
>>
>>
>> Author: Jan Korous
>> Date: 2019-11-07T14:06:43-08:00
>> New Revision: 03b84e4f6d0e1c04f22d69cc445f36e1f713beb4
>>
>> URL: https://github.com/llvm/llvm-
>> project/commit/03b84e4f6d0e1c04f22d69cc445f36e1f713beb4
>> DIFF: https://github.com/llvm/llvm-
>> project/commit/03b84e4f6d0e1c04f22d69cc445f36e1f713beb4.diff
>>
>> LOG: [clang] Report sanitizer blacklist as a dependency in cc1
>>
>> Previously these were reported from the driver which blocked clang-scan-
>> deps from getting the full set of dependencies from cc1 commands.
>>
>> Also the default sanitizer blacklist that is added in driver was never
>> reported as a dependency. I introduced -fsanitize-system-blacklist cc1
>> option to keep track of which blacklists were user-specified and which
>> were added by driver and clang -MD now also reports system blacklists as
>> dependencies.
>>
>> Differential Revision: https://reviews.llvm.org/D69290
>>
>> Added:
>>
>>
>> Modified:
>> clang/include/clang/Driver/Options.td
>> clang/include/clang/Driver/SanitizerArgs.h
>> clang/lib/Driver/SanitizerArgs.cpp
>> clang/lib/Frontend/CompilerInvocation.cpp
>> clang/test/Driver/fsanitize-blacklist.c
>> clang/test/Frontend/dependency-gen.c
>>
>> Removed:
>>
>>
>>
>> ##########################################################################
>> ######
>> diff --git a/clang/include/clang/Driver/Options.td
>> b/clang/include/clang/Driver/Options.td
>> index dcd2976a97f2..c2e30a16b8da 100644
>> --- a/clang/include/clang/Driver/Options.td
>> +++ b/clang/include/clang/Driver/Options.td
>> @@ -979,6 +979,9 @@ def fno_sanitize_EQ : CommaJoined<["-"], "fno-
>> sanitize=">, Group<f_clang_Group>, def fsanitize_blacklist : Joined<["-
>> "], "fsanitize-blacklist=">,
>> Group<f_clang_Group>,
>> HelpText<"Path to blacklist file for
>> sanitizers">;
>> +def fsanitize_system_blacklist : Joined<["-"],
>> +"fsanitize-system-blacklist=">,
>> + HelpText<"Path to system blacklist file for sanitizers">,
>> + Flags<[CC1Option]>;
>> def fno_sanitize_blacklist : Flag<["-"], "fno-sanitize-blacklist">,
>> Group<f_clang_Group>,
>> HelpText<"Don't use blacklist file for
>> sanitizers">;
>>
>> diff --git a/clang/include/clang/Driver/SanitizerArgs.h
>> b/clang/include/clang/Driver/SanitizerArgs.h
>> index c37499e0f201..0aebf8cb225d 100644
>> --- a/clang/include/clang/Driver/SanitizerArgs.h
>> +++ b/clang/include/clang/Driver/SanitizerArgs.h
>> @@ -25,8 +25,8 @@ class SanitizerArgs {
>> SanitizerSet RecoverableSanitizers;
>> SanitizerSet TrapSanitizers;
>>
>> - std::vector<std::string> BlacklistFiles;
>> - std::vector<std::string> ExtraDeps;
>> + std::vector<std::string> UserBlacklistFiles;
>> + std::vector<std::string> SystemBlacklistFiles;
>> int CoverageFeatures = 0;
>> int MsanTrackOrigins = 0;
>> bool MsanUseAfterDtor = true;
>>
>> diff --git a/clang/lib/Driver/SanitizerArgs.cpp
>> b/clang/lib/Driver/SanitizerArgs.cpp
>> index cc6c5e6ef438..8937197c253c 100644
>> --- a/clang/lib/Driver/SanitizerArgs.cpp
>> +++ b/clang/lib/Driver/SanitizerArgs.cpp
>> @@ -557,29 +557,35 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
>>
>> // Setup blacklist files.
>> // Add default blacklist from resource directory.
>> - addDefaultBlacklists(D, Kinds, BlacklistFiles);
>> + addDefaultBlacklists(D, Kinds, SystemBlacklistFiles);
>> // Parse -f(no-)sanitize-blacklist options.
>> for (const auto *Arg : Args) {
>> if (Arg->getOption().matches(options::OPT_fsanitize_blacklist)) {
>> Arg->claim();
>> std::string BLPath = Arg->getValue();
>> if (llvm::sys::fs::exists(BLPath)) {
>> - BlacklistFiles.push_back(BLPath);
>> - ExtraDeps.push_back(BLPath);
>> + UserBlacklistFiles.push_back(BLPath);
>> } else {
>> D.Diag(clang::diag::err_drv_no_such_file) << BLPath;
>> }
>> } else if (Arg-
>>> getOption().matches(options::OPT_fno_sanitize_blacklist)) {
>> Arg->claim();
>> - BlacklistFiles.clear();
>> - ExtraDeps.clear();
>> + UserBlacklistFiles.clear();
>> + SystemBlacklistFiles.clear();
>> }
>> }
>> // Validate blacklists format.
>> {
>> std::string BLError;
>> std::unique_ptr<llvm::SpecialCaseList> SCL(
>> - llvm::SpecialCaseList::create(BlacklistFiles, BLError));
>> + llvm::SpecialCaseList::create(UserBlacklistFiles, BLError));
>> + if (!SCL.get())
>> + D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) <<
>> + BLError; } {
>> + std::string BLError;
>> + std::unique_ptr<llvm::SpecialCaseList> SCL(
>> + llvm::SpecialCaseList::create(SystemBlacklistFiles, BLError));
>> if (!SCL.get())
>> D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) <<
>> BLError;
>> }
>> @@ -952,15 +958,15 @@ void SanitizerArgs::addArgs(const ToolChain &TC,
>> const llvm::opt::ArgList &Args,
>> CmdArgs.push_back(
>> Args.MakeArgString("-fsanitize-trap=" +
>> toString(TrapSanitizers)));
>>
>> - for (const auto &BLPath : BlacklistFiles) {
>> + for (const auto &BLPath : UserBlacklistFiles) {
>> SmallString<64> BlacklistOpt("-fsanitize-blacklist=");
>> BlacklistOpt += BLPath;
>> CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
>> }
>> - for (const auto &Dep : ExtraDeps) {
>> - SmallString<64> ExtraDepOpt("-fdepfile-entry=");
>> - ExtraDepOpt += Dep;
>> - CmdArgs.push_back(Args.MakeArgString(ExtraDepOpt));
>> + for (const auto &BLPath : SystemBlacklistFiles) {
>> + SmallString<64> BlacklistOpt("-fsanitize-system-blacklist=");
>> + BlacklistOpt += BLPath;
>> + CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
>> }
>>
>> if (MsanTrackOrigins)
>>
>> diff --git a/clang/lib/Frontend/CompilerInvocation.cpp
>> b/clang/lib/Frontend/CompilerInvocation.cpp
>> index 195a29d71187..17fd4ce7752b 100644
>> --- a/clang/lib/Frontend/CompilerInvocation.cpp
>> +++ b/clang/lib/Frontend/CompilerInvocation.cpp
>> @@ -1447,7 +1447,26 @@ static void
>> ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
>> // Add sanitizer blacklists as extra dependencies.
>> // They won't be discovered by the regular preprocessor, so
>> // we let make / ninja to know about this implicit dependency.
>> - Opts.ExtraDeps = Args.getAllArgValues(OPT_fdepfile_entry);
>> + if (!Args.hasArg(OPT_fno_sanitize_blacklist)) {
>> + for (const auto *A : Args.filtered(OPT_fsanitize_blacklist)) {
>> + StringRef Val = A->getValue();
>> + if (Val.find('=') == StringRef::npos)
>> + Opts.ExtraDeps.push_back(Val);
>> + }
>> + if (Opts.IncludeSystemHeaders) {
>> + for (const auto *A : Args.filtered(OPT_fsanitize_system_blacklist))
>> {
>> + StringRef Val = A->getValue();
>> + if (Val.find('=') == StringRef::npos)
>> + Opts.ExtraDeps.push_back(Val);
>> + }
>> + }
>> + }
>> +
>> + // Propagate the extra dependencies.
>> + for (const auto *A : Args.filtered(OPT_fdepfile_entry)) {
>> + Opts.ExtraDeps.push_back(A->getValue());
>> + }
>> +
>> // Only the -fmodule-file=<file> form.
>> for (const auto *A : Args.filtered(OPT_fmodule_file)) {
>> StringRef Val = A->getValue();
>>
>> diff --git a/clang/test/Driver/fsanitize-blacklist.c
>> b/clang/test/Driver/fsanitize-blacklist.c
>> index e08905c94eda..6878298e6752 100644
>> --- a/clang/test/Driver/fsanitize-blacklist.c
>> +++ b/clang/test/Driver/fsanitize-blacklist.c
>> @@ -16,22 +16,18 @@
>> // RUN: %clang -target aarch64-linux-gnu -fsanitize=hwaddress -fsanitize-
>> blacklist=%t.good -fsanitize-blacklist=%t.second %s -### 2>&1 | FileCheck
>> %s --check-prefix=CHECK-BLACKLIST // CHECK-BLACKLIST: -fsanitize-
>> blacklist={{.*}}.good" "-fsanitize-blacklist={{.*}}.second
>>
>> -// Now, check for -fdepfile-entry flags.
>> -// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-
>> blacklist=%t.good -fsanitize-blacklist=%t.second %s -### 2>&1 | FileCheck
>> %s --check-prefix=CHECK-BLACKLIST2 -// CHECK-BLACKLIST2: -fdepfile-
>> entry={{.*}}.good" "-fdepfile-entry={{.*}}.second
>> -
>> // Check that the default blacklist is not added as an extra dependency.
>> // RUN: %clang -target x86_64-linux-gnu -fsanitize=address -resource-
>> dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-
>> prefix=CHECK-DEFAULT-BLACKLIST-ASAN --implicit-check-not=fdepfile-entry --
>> implicit-check-not=-fsanitize-blacklist=
>> -// CHECK-DEFAULT-BLACKLIST-ASAN: -fsanitize-
>> blacklist={{.*[^w]}}asan_blacklist.txt
>> +// CHECK-DEFAULT-BLACKLIST-ASAN:
>> +-fsanitize-system-blacklist={{.*[^w]}}asan_blacklist.txt
>> // RUN: %clang -target x86_64-linux-gnu -fsanitize=hwaddress -resource-
>> dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-
>> prefix=CHECK-DEFAULT-BLACKLIST-HWASAN --implicit-check-not=fdepfile-entry
>> --implicit-check-not=-fsanitize-blacklist=
>> -// CHECK-DEFAULT-BLACKLIST-HWASAN: -fsanitize-
>> blacklist={{.*}}hwasan_blacklist.txt
>> +// CHECK-DEFAULT-BLACKLIST-HWASAN:
>> +-fsanitize-system-blacklist={{.*}}hwasan_blacklist.txt
>>
>> // RUN: %clang -target x86_64-linux-gnu -fsanitize=integer -resource-
>> dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-
>> prefix=CHECK-DEFAULT-UBSAN-BLACKLIST --implicit-check-not=fdepfile-entry -
>> -implicit-check-not=-fsanitize-blacklist=
>> // RUN: %clang -target x86_64-linux-gnu -fsanitize=nullability -resource-
>> dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-
>> prefix=CHECK-DEFAULT-UBSAN-BLACKLIST --implicit-check-not=fdepfile-entry -
>> -implicit-check-not=-fsanitize-blacklist=
>> // RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined -resource-
>> dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-
>> prefix=CHECK-DEFAULT-UBSAN-BLACKLIST --implicit-check-not=fdepfile-entry -
>> -implicit-check-not=-fsanitize-blacklist=
>> // RUN: %clang -target x86_64-linux-gnu -fsanitize=alignment -resource-
>> dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-
>> prefix=CHECK-DEFAULT-UBSAN-BLACKLIST --implicit-check-not=fdepfile-entry -
>> -implicit-check-not=-fsanitize-blacklist=
>> // RUN: %clang -target %itanium_abi_triple -fsanitize=float-divide-by-
>> zero -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --
>> check-prefix=CHECK-DEFAULT-UBSAN-BLACKLIST --implicit-check-not=fdepfile-
>> entry --implicit-check-not=-fsanitize-blacklist=
>> -// CHECK-DEFAULT-UBSAN-BLACKLIST: -fsanitize-
>> blacklist={{.*}}ubsan_blacklist.txt
>> +// CHECK-DEFAULT-UBSAN-BLACKLIST:
>> +-fsanitize-system-blacklist={{.*}}ubsan_blacklist.txt
>>
>> // Check that combining ubsan and another sanitizer results in both
>> blacklists being used.
>> // RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined,address -
>> resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-
>> prefix=CHECK-DEFAULT-UBSAN-BLACKLIST --check-prefix=CHECK-DEFAULT-ASAN-
>> BLACKLIST --implicit-check-not=fdepfile-entry --implicit-check-not=-
>> fsanitize-blacklist=
>>
>> diff --git a/clang/test/Frontend/dependency-gen.c
>> b/clang/test/Frontend/dependency-gen.c
>> index 963419cb1188..1db9b04c1d9f 100644
>> --- a/clang/test/Frontend/dependency-gen.c
>> +++ b/clang/test/Frontend/dependency-gen.c
>> @@ -27,3 +27,20 @@
>> #ifndef INCLUDE_FLAG_TEST
>> #include <x.h>
>> #endif
>> +
>> +// RUN: echo "fun:foo" > %t.blacklist1
>> +// RUN: echo "fun:foo" > %t.blacklist2
>> +// RUN: %clang -MD -MF - %s -fsyntax-only
>> +-resource-dir=%S/Inputs/resource_dir_with_cfi_blacklist -fsanitize=cfi-
>> vcall -flto -fvisibility=hidden -fsanitize-blacklist=%t.blacklist1 -
>> fsanitize-blacklist=%t.blacklist2 -I ./ | FileCheck -check-prefix=TWO-
>> BLACK-LISTS %s // TWO-BLACK-LISTS: dependency-gen.o:
>> +// TWO-BLACK-LISTS-DAG: blacklist1
>> +// TWO-BLACK-LISTS-DAG: blacklist2
>> +// TWO-BLACK-LISTS-DAG: x.h
>> +// TWO-BLACK-LISTS-DAG: dependency-gen.c
>> +
>> +// RUN: %clang -MD -MF - %s -fsyntax-only
>> +-resource-dir=%S/Inputs/resource_dir_with_cfi_blacklist -fsanitize=cfi-
>> vcall -flto -fvisibility=hidden -I ./ | FileCheck -check-prefix=USER-AND-
>> SYS-DEPS %s // USER-AND-SYS-DEPS: dependency-gen.o:
>> +// USER-AND-SYS-DEPS-DAG: cfi_blacklist.txt
>> +
>> +// RUN: %clang -MMD -MF - %s -fsyntax-only
>> +-resource-dir=%S/Inputs/resource_dir_with_cfi_blacklist -fsanitize=cfi-
>> vcall -flto -fvisibility=hidden -I ./ | FileCheck -check-prefix=ONLY-USER-
>> DEPS %s // ONLY-USER-DEPS: dependency-gen.o:
>> +// NOT-ONLY-USER-DEPS: cfi_blacklist.txt
>> \ No newline at end of file
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list