diff options
| author | George Karpenkov <ekarpenkov@apple.com> | 2018-07-11 01:23:27 +0000 |
|---|---|---|
| committer | George Karpenkov <ekarpenkov@apple.com> | 2018-07-11 01:23:27 +0000 |
| commit | 95720c16b352b7dfaa8e6f1bf9de32fe13932655 (patch) | |
| tree | 7e57bad869dd7da4c6379d414636f0811d516458 | |
| parent | fb361d25258b7a9d2387344d0cff7e1722bc2589 (diff) | |
| download | bcm5719-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.h | 23 | ||||
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp | 15 |
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); } |

