]> granicus.if.org Git - clang/commitdiff
Teach SanitizerBlacklist to blacklist by SourceLocation. NFC.
authorAlexey Samsonov <vonosmas@gmail.com>
Thu, 16 Oct 2014 23:50:26 +0000 (23:50 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Thu, 16 Oct 2014 23:50:26 +0000 (23:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219993 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/SanitizerBlacklist.h
lib/AST/ASTContext.cpp
lib/AST/Decl.cpp
lib/Basic/SanitizerBlacklist.cpp

index 8fa4357b75f4ae621df4ac7a0ca7802d77ecfbcd..dfe55a18eb9902a049e62edef4b6f64df4ea5e29 100644 (file)
 #define LLVM_CLANG_BASIC_SANITIZERBLACKLIST_H
 
 #include "clang/Basic/LLVM.h"
+#include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/SourceManager.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/SpecialCaseList.h"
 #include <memory>
-#include <string>
 
 namespace llvm {
 class GlobalVariable;
@@ -29,9 +30,10 @@ namespace clang {
 
 class SanitizerBlacklist {
   std::unique_ptr<llvm::SpecialCaseList> SCL;
+  SourceManager &SM;
 
 public:
-  SanitizerBlacklist(const std::string &BlacklistPath);
+  SanitizerBlacklist(StringRef BlacklistPath, SourceManager &SM);
   bool isIn(const llvm::Function &F) const;
   bool isIn(const llvm::GlobalVariable &G,
             StringRef Category = StringRef()) const;
@@ -40,6 +42,8 @@ public:
   bool isBlacklistedFunction(StringRef FunctionName) const;
   bool isBlacklistedFile(StringRef FileName,
                          StringRef Category = StringRef()) const;
+  bool isBlacklistedLocation(SourceLocation Loc,
+                             StringRef Category = StringRef()) const;
 };
 
 }  // end namespace clang
index 0c8fa2a894b1b679498742127668e5d6b61c0e93..8f8ae8da0db2d796d4e125458ed71b147ab26797 100644 (file)
@@ -738,7 +738,7 @@ ASTContext::ASTContext(LangOptions &LOpts, SourceManager &SM,
       BlockDescriptorExtendedType(nullptr), cudaConfigureCallDecl(nullptr),
       NullTypeSourceInfo(QualType()), FirstLocalImport(), LastLocalImport(),
       SourceMgr(SM), LangOpts(LOpts),
-      SanitizerBL(new SanitizerBlacklist(LangOpts.Sanitize.BlacklistFile)),
+      SanitizerBL(new SanitizerBlacklist(LangOpts.Sanitize.BlacklistFile, SM)),
       AddrSpaceMap(nullptr), Target(nullptr), PrintingPolicy(LOpts),
       Idents(idents), Selectors(sels), BuiltinInfo(builtins),
       DeclarationNames(*this), ExternalSource(nullptr), Listener(nullptr),
index c01272ec134855ebbc6f28153c5acb757772f6f9..0de5459a4c156e4ea9f1f1d8c836146898c8bf76 100644 (file)
@@ -3621,9 +3621,8 @@ bool RecordDecl::mayInsertExtraPadding(bool EmitRemark) const {
   if (!Context.getLangOpts().Sanitize.Address ||
       !Context.getLangOpts().Sanitize.SanitizeAddressFieldPadding)
     return false;
-  auto &Blacklist = Context.getSanitizerBlacklist();
+  const auto &Blacklist = Context.getSanitizerBlacklist();
   const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(this);
-  StringRef Filename = Context.getSourceManager().getFilename(getLocation());
   // We may be able to relax some of these requirements.
   int ReasonToReject = -1;
   if (!CXXRD || CXXRD->isExternCContext())
@@ -3638,7 +3637,7 @@ bool RecordDecl::mayInsertExtraPadding(bool EmitRemark) const {
     ReasonToReject = 4;  // has trivial destructor.
   else if (CXXRD->isStandardLayout())
     ReasonToReject = 5;  // is standard layout.
-  else if (Blacklist.isBlacklistedFile(Filename, "field-padding"))
+  else if (Blacklist.isBlacklistedLocation(getLocation(), "field-padding"))
     ReasonToReject = 6;  // is in a blacklisted file.
   else if (Blacklist.isBlacklistedType(getQualifiedNameAsString(),
                                        "field-padding"))
index 84ec2100b6279ffd35472abb44943ac05a34138f..f0221331ed2037ccb43c19e43e9ca4f6298110a7 100644 (file)
@@ -29,8 +29,9 @@ static StringRef GetGlobalTypeString(const llvm::GlobalValue &G) {
   return "<unknown type>";
 }
 
-SanitizerBlacklist::SanitizerBlacklist(const std::string &BlacklistPath)
-    : SCL(llvm::SpecialCaseList::createOrDie(BlacklistPath)) {}
+SanitizerBlacklist::SanitizerBlacklist(StringRef BlacklistPath,
+                                       SourceManager &SM)
+    : SCL(llvm::SpecialCaseList::createOrDie(BlacklistPath)), SM(SM) {}
 
 bool SanitizerBlacklist::isIn(const llvm::Function &F) const {
   return isBlacklistedFile(F.getParent()->getModuleIdentifier()) ||
@@ -57,3 +58,9 @@ bool SanitizerBlacklist::isBlacklistedFile(StringRef FileName,
                                            StringRef Category) const {
   return SCL->inSection("src", FileName, Category);
 }
+
+bool SanitizerBlacklist::isBlacklistedLocation(SourceLocation Loc,
+                                               StringRef Category) const {
+  return !Loc.isInvalid() && isBlacklistedFile(SM.getFilename(Loc), Category);
+}
+