diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 | 
| commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
| tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /clang/lib/StaticAnalyzer/Core/CheckerManager.cpp | |
| parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) | |
Notes
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/CheckerManager.cpp')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/CheckerManager.cpp | 59 | 
1 files changed, 28 insertions, 31 deletions
| diff --git a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp index a9361837cf68..86cecf6524f0 100644 --- a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp @@ -61,12 +61,12 @@ void CheckerManager::finishedCheckerRegistration() {  }  void CheckerManager::reportInvalidCheckerOptionValue( -    const CheckerBase *C, StringRef OptionName, StringRef ExpectedValueDesc) { +    const CheckerBase *C, StringRef OptionName, +    StringRef ExpectedValueDesc) const { -  Context.getDiagnostics() -      .Report(diag::err_analyzer_checker_option_invalid_input) -          << (llvm::Twine() + C->getTagDescription() + ":" + OptionName).str() -          << ExpectedValueDesc; +  getDiagnostics().Report(diag::err_analyzer_checker_option_invalid_input) +      << (llvm::Twine() + C->getTagDescription() + ":" + OptionName).str() +      << ExpectedValueDesc;  }  //===----------------------------------------------------------------------===// @@ -243,13 +243,13 @@ void CheckerManager::runCheckersForObjCMessage(ObjCMessageVisitKind visitKind,                                                 const ObjCMethodCall &msg,                                                 ExprEngine &Eng,                                                 bool WasInlined) { -  auto &checkers = getObjCMessageCheckers(visitKind); +  const auto &checkers = getObjCMessageCheckers(visitKind);    CheckObjCMessageContext C(visitKind, checkers, msg, Eng, WasInlined);    expandGraphWithCheckers(C, Dst, Src);  }  const std::vector<CheckerManager::CheckObjCMessageFunc> & -CheckerManager::getObjCMessageCheckers(ObjCMessageVisitKind Kind) { +CheckerManager::getObjCMessageCheckers(ObjCMessageVisitKind Kind) const {    switch (Kind) {    case ObjCMessageVisitKind::Pre:      return PreObjCMessageCheckers; @@ -507,35 +507,38 @@ namespace {      using CheckersTy = std::vector<CheckerManager::CheckNewAllocatorFunc>;      const CheckersTy &Checkers; -    const CXXNewExpr *NE; -    SVal Target; +    const CXXAllocatorCall &Call;      bool WasInlined;      ExprEngine &Eng; -    CheckNewAllocatorContext(const CheckersTy &Checkers, const CXXNewExpr *NE, -                             SVal Target, bool WasInlined, ExprEngine &Eng) -        : Checkers(Checkers), NE(NE), Target(Target), WasInlined(WasInlined), -          Eng(Eng) {} +    CheckNewAllocatorContext(const CheckersTy &Checkers, +                             const CXXAllocatorCall &Call, bool WasInlined, +                             ExprEngine &Eng) +        : Checkers(Checkers), Call(Call), WasInlined(WasInlined), Eng(Eng) {}      CheckersTy::const_iterator checkers_begin() { return Checkers.begin(); }      CheckersTy::const_iterator checkers_end() { return Checkers.end(); }      void runChecker(CheckerManager::CheckNewAllocatorFunc checkFn,                      NodeBuilder &Bldr, ExplodedNode *Pred) { -      ProgramPoint L = PostAllocatorCall(NE, Pred->getLocationContext()); +      ProgramPoint L = +          PostAllocatorCall(Call.getOriginExpr(), Pred->getLocationContext());        CheckerContext C(Bldr, Eng, Pred, L, WasInlined); -      checkFn(NE, Target, C); +      checkFn(cast<CXXAllocatorCall>(*Call.cloneWithState(Pred->getState())), +              C);      }    };  } // namespace -void CheckerManager::runCheckersForNewAllocator( -    const CXXNewExpr *NE, SVal Target, ExplodedNodeSet &Dst, ExplodedNode *Pred, -    ExprEngine &Eng, bool WasInlined) { +void CheckerManager::runCheckersForNewAllocator(const CXXAllocatorCall &Call, +                                                ExplodedNodeSet &Dst, +                                                ExplodedNode *Pred, +                                                ExprEngine &Eng, +                                                bool WasInlined) {    ExplodedNodeSet Src;    Src.insert(Pred); -  CheckNewAllocatorContext C(NewAllocatorCheckers, NE, Target, WasInlined, Eng); +  CheckNewAllocatorContext C(NewAllocatorCheckers, Call, WasInlined, Eng);    expandGraphWithCheckers(C, Dst, Src);  } @@ -650,8 +653,9 @@ CheckerManager::runCheckersForEvalAssume(ProgramStateRef state,  void CheckerManager::runCheckersForEvalCall(ExplodedNodeSet &Dst,                                              const ExplodedNodeSet &Src,                                              const CallEvent &Call, -                                            ExprEngine &Eng) { -  for (const auto Pred : Src) { +                                            ExprEngine &Eng, +                                            const EvalCallOptions &CallOpts) { +  for (auto *const Pred : Src) {      bool anyEvaluated = false;      ExplodedNodeSet checkDst; @@ -662,10 +666,8 @@ void CheckerManager::runCheckersForEvalCall(ExplodedNodeSet &Dst,        // TODO: Support the situation when the call doesn't correspond        // to any Expr.        ProgramPoint L = ProgramPoint::getProgramPoint( -          cast<CallExpr>(Call.getOriginExpr()), -          ProgramPoint::PostStmtKind, -          Pred->getLocationContext(), -          EvalCallChecker.Checker); +          Call.getOriginExpr(), ProgramPoint::PostStmtKind, +          Pred->getLocationContext(), EvalCallChecker.Checker);        bool evaluated = false;        { // CheckerContext generates transitions(populates checkDest) on          // destruction, so introduce the scope to make sure it gets properly @@ -687,7 +689,7 @@ void CheckerManager::runCheckersForEvalCall(ExplodedNodeSet &Dst,      // If none of the checkers evaluated the call, ask ExprEngine to handle it.      if (!anyEvaluated) {        NodeBuilder B(Pred, Dst, Eng.getBuilderContext()); -      Eng.defaultEvalCall(B, Pred, Call); +      Eng.defaultEvalCall(B, Pred, Call, CallOpts);      }    }  } @@ -902,8 +904,3 @@ CheckerManager::getCachedStmtCheckersFor(const Stmt *S, bool isPreVisit) {        Checkers.push_back(Info.CheckFn);    return Checkers;  } - -CheckerManager::~CheckerManager() { -  for (const auto &CheckerDtor : CheckerDtors) -    CheckerDtor(); -} | 
