Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow specifying sanitizers in blacklists
Summary: This is the follow-up patch to D37924. This change refactors clang to use the the newly added section headers in SpecialCaseList to specify which sanitizers blacklists entries should apply to, like so: [cfi-vcall] fun:*bad_vcall* [cfi-derived-cast|cfi-unrelated-cast] fun:*bad_cast* The SanitizerSpecialCaseList class has been added to allow querying by SanitizerMask, and SanitizerBlacklist and its downstream users have been updated to provide that information. Old blacklists not using sections will continue to function identically since the blacklist entries will be placed into a '[*]' section by default matching against all sanitizers. Reviewers: pcc, kcc, eugenis, vsk Reviewed By: eugenis Subscribers: dberris, cfe-commits, mgorny Differential Revision: https://reviews.llvm.org/D37925 llvm-svn: 314171
- Loading branch information
Showing
22 changed files
with
310 additions
and
88 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
//===--- SanitizerSpecialCaseList.h - SCL for sanitizers --------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// An extension of SpecialCaseList to allowing querying sections by | ||
// SanitizerMask. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
#ifndef LLVM_CLANG_BASIC_SANITIZERSPECIALCASELIST_H | ||
#define LLVM_CLANG_BASIC_SANITIZERSPECIALCASELIST_H | ||
|
||
#include "clang/Basic/LLVM.h" | ||
#include "clang/Basic/Sanitizers.h" | ||
#include "llvm/ADT/StringRef.h" | ||
#include "llvm/Support/SpecialCaseList.h" | ||
#include <memory> | ||
|
||
namespace clang { | ||
|
||
class SanitizerSpecialCaseList : public llvm::SpecialCaseList { | ||
public: | ||
static std::unique_ptr<SanitizerSpecialCaseList> | ||
create(const std::vector<std::string> &Paths, std::string &Error); | ||
|
||
static std::unique_ptr<SanitizerSpecialCaseList> | ||
createOrDie(const std::vector<std::string> &Paths); | ||
|
||
// Query blacklisted entries if any bit in Mask matches the entry's section. | ||
bool inSection(SanitizerMask Mask, StringRef Prefix, StringRef Query, | ||
StringRef Category = StringRef()) const; | ||
|
||
protected: | ||
// Initialize SanitizerSections. | ||
void createSanitizerSections(); | ||
|
||
struct SanitizerSection { | ||
SanitizerSection(SanitizerMask SM, SectionEntries &E) | ||
: Mask(SM), Entries(E){}; | ||
|
||
SanitizerMask Mask; | ||
SectionEntries &Entries; | ||
}; | ||
|
||
std::vector<SanitizerSection> SanitizerSections; | ||
}; | ||
|
||
} // end namespace clang | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
//===--- SanitizerSpecialCaseList.cpp - SCL for sanitizers ----------------===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// An extension of SpecialCaseList to allowing querying sections by | ||
// SanitizerMask. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
#include "clang/Basic/SanitizerSpecialCaseList.h" | ||
|
||
using namespace clang; | ||
|
||
std::unique_ptr<SanitizerSpecialCaseList> | ||
SanitizerSpecialCaseList::create(const std::vector<std::string> &Paths, | ||
std::string &Error) { | ||
std::unique_ptr<clang::SanitizerSpecialCaseList> SSCL( | ||
new SanitizerSpecialCaseList()); | ||
if (SSCL->createInternal(Paths, Error)) { | ||
SSCL->createSanitizerSections(); | ||
return SSCL; | ||
} | ||
return nullptr; | ||
} | ||
|
||
std::unique_ptr<SanitizerSpecialCaseList> | ||
SanitizerSpecialCaseList::createOrDie(const std::vector<std::string> &Paths) { | ||
std::string Error; | ||
if (auto SSCL = create(Paths, Error)) | ||
return SSCL; | ||
llvm::report_fatal_error(Error); | ||
} | ||
|
||
void SanitizerSpecialCaseList::createSanitizerSections() { | ||
for (auto &S : Sections) { | ||
SanitizerMask Mask = 0; | ||
|
||
#define SANITIZER(NAME, ID) \ | ||
if (S.SectionMatcher->match(NAME)) \ | ||
Mask |= SanitizerKind::ID; | ||
#define SANITIZER_GROUP(NAME, ID, ALIAS) SANITIZER(NAME, ID) | ||
|
||
#include "clang/Basic/Sanitizers.def" | ||
#undef SANITIZER | ||
#undef SANITIZER_GROUP | ||
|
||
SanitizerSections.emplace_back(Mask, S.Entries); | ||
} | ||
} | ||
|
||
bool SanitizerSpecialCaseList::inSection(SanitizerMask Mask, StringRef Prefix, | ||
StringRef Query, | ||
StringRef Category) const { | ||
for (auto &S : SanitizerSections) | ||
if ((S.Mask & Mask) && | ||
SpecialCaseList::inSection(S.Entries, Prefix, Query, Category)) | ||
return true; | ||
|
||
return false; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.