summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Karpenkov <ekarpenkov@apple.com>2018-07-11 01:23:27 +0000
committerGeorge Karpenkov <ekarpenkov@apple.com>2018-07-11 01:23:27 +0000
commit95720c16b352b7dfaa8e6f1bf9de32fe13932655 (patch)
tree7e57bad869dd7da4c6379d414636f0811d516458
parentfb361d25258b7a9d2387344d0cff7e1722bc2589 (diff)
downloadbcm5719-llvm-95720c16b352b7dfaa8e6f1bf9de32fe13932655.tar.gz
bcm5719-llvm-95720c16b352b7dfaa8e6f1bf9de32fe13932655.zip
[analyzer] Pass through all arguments from the registerChecker() to the checker constructor
A lot of checkers could be cleaned up in a similar way Differential Revision: https://reviews.llvm.org/D49050 llvm-svn: 336753
-rw-r--r--clang/include/clang/StaticAnalyzer/Core/CheckerManager.h23
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp15
2 files changed, 13 insertions, 25 deletions
diff --git a/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h b/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h
index 9d87b440dc5..99a8eb01fa7 100644
--- a/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h
+++ b/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h
@@ -144,31 +144,18 @@ public:
//===----------------------------------------------------------------------===//
/// Used to register checkers.
+ /// All arguments are automatically passed through to the checker
+ /// constructor.
///
/// \returns a pointer to the checker object.
- template <typename CHECKER>
- CHECKER *registerChecker() {
- CheckerTag tag = getTag<CHECKER>();
- CheckerRef &ref = CheckerTags[tag];
- if (ref)
- return static_cast<CHECKER *>(ref); // already registered.
-
- CHECKER *checker = new CHECKER();
- checker->Name = CurrentCheckName;
- CheckerDtors.push_back(CheckerDtor(checker, destruct<CHECKER>));
- CHECKER::_register(checker, *this);
- ref = checker;
- return checker;
- }
-
- template <typename CHECKER>
- CHECKER *registerChecker(AnalyzerOptions &AOpts) {
+ template <typename CHECKER, typename... AT>
+ CHECKER *registerChecker(AT... Args) {
CheckerTag tag = getTag<CHECKER>();
CheckerRef &ref = CheckerTags[tag];
if (ref)
return static_cast<CHECKER *>(ref); // already registered.
- CHECKER *checker = new CHECKER(AOpts);
+ CHECKER *checker = new CHECKER(Args...);
checker->Name = CurrentCheckName;
CheckerDtors.push_back(CheckerDtor(checker, destruct<CHECKER>));
CHECKER::_register(checker, *this);
diff --git a/clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp b/clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
index 126e57645a4..914ba86850e 100644
--- a/clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
@@ -56,6 +56,12 @@ class DynamicTypePropagation:
check::PostStmt<CXXNewExpr>,
check::PreObjCMessage,
check::PostObjCMessage > {
+private:
+ /// This value is set to true, when the Generics checker is turned on.
+ bool CheckGenerics;
+public:
+ DynamicTypePropagation(bool CheckGenerics)
+ : CheckGenerics(CheckGenerics) {}
const ObjCObjectType *getObjectTypeForAllocAndNew(const ObjCMessageExpr *MsgE,
CheckerContext &C) const;
@@ -107,9 +113,6 @@ public:
void checkDeadSymbols(SymbolReaper &SR, CheckerContext &C) const;
void checkPreObjCMessage(const ObjCMethodCall &M, CheckerContext &C) const;
void checkPostObjCMessage(const ObjCMethodCall &M, CheckerContext &C) const;
-
- /// This value is set to true, when the Generics checker is turned on.
- DefaultBool CheckGenerics;
};
} // end anonymous namespace
@@ -995,11 +998,9 @@ DynamicTypePropagation::GenericsBugVisitor::VisitNode(const ExplodedNode *N,
/// Register checkers.
void ento::registerObjCGenericsChecker(CheckerManager &mgr) {
- DynamicTypePropagation *checker =
- mgr.registerChecker<DynamicTypePropagation>();
- checker->CheckGenerics = true;
+ mgr.registerChecker<DynamicTypePropagation>(/*CheckGenerics=*/true);
}
void ento::registerDynamicTypePropagation(CheckerManager &mgr) {
- mgr.registerChecker<DynamicTypePropagation>();
+ mgr.registerChecker<DynamicTypePropagation>(/*CheckGenerics=*/false);
}
OpenPOWER on IntegriCloud