Skip to content

Commit c8a0a9c

Browse files
committed
Reland "[clang] Report sanitizer blacklist as a dependency in cc1"
This reverts commit 9b8413a. # Conflicts: # clang/test/Driver/fsanitize-blacklist.c
1 parent 8ee63ee commit c8a0a9c

File tree

6 files changed

+62
-21
lines changed

6 files changed

+62
-21
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,9 @@ def fno_sanitize_EQ : CommaJoined<["-"], "fno-sanitize=">, Group<f_clang_Group>,
978978
def fsanitize_blacklist : Joined<["-"], "fsanitize-blacklist=">,
979979
Group<f_clang_Group>,
980980
HelpText<"Path to blacklist file for sanitizers">;
981+
def fsanitize_system_blacklist : Joined<["-"], "fsanitize-system-blacklist=">,
982+
HelpText<"Path to system blacklist file for sanitizers">,
983+
Flags<[CC1Option]>;
981984
def fno_sanitize_blacklist : Flag<["-"], "fno-sanitize-blacklist">,
982985
Group<f_clang_Group>,
983986
HelpText<"Don't use blacklist file for sanitizers">;

clang/include/clang/Driver/SanitizerArgs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ class SanitizerArgs {
2525
SanitizerSet RecoverableSanitizers;
2626
SanitizerSet TrapSanitizers;
2727

28-
std::vector<std::string> BlacklistFiles;
29-
std::vector<std::string> ExtraDeps;
28+
std::vector<std::string> UserBlacklistFiles;
29+
std::vector<std::string> SystemBlacklistFiles;
3030
int CoverageFeatures = 0;
3131
int MsanTrackOrigins = 0;
3232
bool MsanUseAfterDtor = true;

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -547,29 +547,35 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
547547

548548
// Setup blacklist files.
549549
// Add default blacklist from resource directory.
550-
addDefaultBlacklists(D, Kinds, BlacklistFiles);
550+
addDefaultBlacklists(D, Kinds, SystemBlacklistFiles);
551551
// Parse -f(no-)sanitize-blacklist options.
552552
for (const auto *Arg : Args) {
553553
if (Arg->getOption().matches(options::OPT_fsanitize_blacklist)) {
554554
Arg->claim();
555555
std::string BLPath = Arg->getValue();
556556
if (llvm::sys::fs::exists(BLPath)) {
557-
BlacklistFiles.push_back(BLPath);
558-
ExtraDeps.push_back(BLPath);
557+
UserBlacklistFiles.push_back(BLPath);
559558
} else {
560559
D.Diag(clang::diag::err_drv_no_such_file) << BLPath;
561560
}
562561
} else if (Arg->getOption().matches(options::OPT_fno_sanitize_blacklist)) {
563562
Arg->claim();
564-
BlacklistFiles.clear();
565-
ExtraDeps.clear();
563+
UserBlacklistFiles.clear();
564+
SystemBlacklistFiles.clear();
566565
}
567566
}
568567
// Validate blacklists format.
569568
{
570569
std::string BLError;
571570
std::unique_ptr<llvm::SpecialCaseList> SCL(
572-
llvm::SpecialCaseList::create(BlacklistFiles, BLError));
571+
llvm::SpecialCaseList::create(UserBlacklistFiles, BLError));
572+
if (!SCL.get())
573+
D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) << BLError;
574+
}
575+
{
576+
std::string BLError;
577+
std::unique_ptr<llvm::SpecialCaseList> SCL(
578+
llvm::SpecialCaseList::create(SystemBlacklistFiles, BLError));
573579
if (!SCL.get())
574580
D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) << BLError;
575581
}
@@ -920,15 +926,15 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
920926
CmdArgs.push_back(
921927
Args.MakeArgString("-fsanitize-trap=" + toString(TrapSanitizers)));
922928

923-
for (const auto &BLPath : BlacklistFiles) {
929+
for (const auto &BLPath : UserBlacklistFiles) {
924930
SmallString<64> BlacklistOpt("-fsanitize-blacklist=");
925931
BlacklistOpt += BLPath;
926932
CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
927933
}
928-
for (const auto &Dep : ExtraDeps) {
929-
SmallString<64> ExtraDepOpt("-fdepfile-entry=");
930-
ExtraDepOpt += Dep;
931-
CmdArgs.push_back(Args.MakeArgString(ExtraDepOpt));
934+
for (const auto &BLPath : SystemBlacklistFiles) {
935+
SmallString<64> BlacklistOpt("-fsanitize-system-blacklist=");
936+
BlacklistOpt += BLPath;
937+
CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
932938
}
933939

934940
if (MsanTrackOrigins)

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1452,7 +1452,26 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
14521452
// Add sanitizer blacklists as extra dependencies.
14531453
// They won't be discovered by the regular preprocessor, so
14541454
// we let make / ninja to know about this implicit dependency.
1455-
Opts.ExtraDeps = Args.getAllArgValues(OPT_fdepfile_entry);
1455+
if (!Args.hasArg(OPT_fno_sanitize_blacklist)) {
1456+
for (const auto *A : Args.filtered(OPT_fsanitize_blacklist)) {
1457+
StringRef Val = A->getValue();
1458+
if (Val.find('=') == StringRef::npos)
1459+
Opts.ExtraDeps.push_back(Val);
1460+
}
1461+
if (Opts.IncludeSystemHeaders) {
1462+
for (const auto *A : Args.filtered(OPT_fsanitize_system_blacklist)) {
1463+
StringRef Val = A->getValue();
1464+
if (Val.find('=') == StringRef::npos)
1465+
Opts.ExtraDeps.push_back(Val);
1466+
}
1467+
}
1468+
}
1469+
1470+
// Propagate the extra dependencies.
1471+
for (const auto *A : Args.filtered(OPT_fdepfile_entry)) {
1472+
Opts.ExtraDeps.push_back(A->getValue());
1473+
}
1474+
14561475
// Only the -fmodule-file=<file> form.
14571476
for (const auto *A : Args.filtered(OPT_fmodule_file)) {
14581477
StringRef Val = A->getValue();

clang/test/Driver/fsanitize-blacklist.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,17 @@
1616
// 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
1717
// CHECK-BLACKLIST: -fsanitize-blacklist={{.*}}.good" "-fsanitize-blacklist={{.*}}.second
1818

19-
// Now, check for -fdepfile-entry flags.
20-
// 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
21-
// CHECK-BLACKLIST2: -fdepfile-entry={{.*}}.good" "-fdepfile-entry={{.*}}.second
22-
2319
// Check that the default blacklist is not added as an extra dependency.
2420
// 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=
25-
// CHECK-DEFAULT-BLACKLIST-ASAN: -fsanitize-blacklist={{.*[^w]}}asan_blacklist.txt
21+
// CHECK-DEFAULT-BLACKLIST-ASAN: -fsanitize-system-blacklist={{.*[^w]}}asan_blacklist.txt
2622
// 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=
27-
// CHECK-DEFAULT-BLACKLIST-HWASAN: -fsanitize-blacklist={{.*}}hwasan_blacklist.txt
23+
// CHECK-DEFAULT-BLACKLIST-HWASAN: -fsanitize-system-blacklist={{.*}}hwasan_blacklist.txt
2824

2925
// 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=
3026
// 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=
3127
// 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=
3228
// 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=
33-
// CHECK-DEFAULT-UBSAN-BLACKLIST: -fsanitize-blacklist={{.*}}ubsan_blacklist.txt
29+
// CHECK-DEFAULT-UBSAN-BLACKLIST: -fsanitize-system-blacklist={{.*}}ubsan_blacklist.txt
3430

3531
// Check that combining ubsan and another sanitizer results in both blacklists being used.
3632
// 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=

clang/test/Frontend/dependency-gen.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,20 @@
2727
#ifndef INCLUDE_FLAG_TEST
2828
#include <x.h>
2929
#endif
30+
31+
// RUN: echo "fun:foo" > %t.blacklist1
32+
// RUN: echo "fun:foo" > %t.blacklist2
33+
// 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
34+
// TWO-BLACK-LISTS: dependency-gen.o:
35+
// TWO-BLACK-LISTS-DAG: blacklist1
36+
// TWO-BLACK-LISTS-DAG: blacklist2
37+
// TWO-BLACK-LISTS-DAG: x.h
38+
// TWO-BLACK-LISTS-DAG: dependency-gen.c
39+
40+
// 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
41+
// USER-AND-SYS-DEPS: dependency-gen.o:
42+
// USER-AND-SYS-DEPS-DAG: cfi_blacklist.txt
43+
44+
// 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
45+
// ONLY-USER-DEPS: dependency-gen.o:
46+
// NOT-ONLY-USER-DEPS: cfi_blacklist.txt

0 commit comments

Comments
 (0)