diff options
Diffstat (limited to 'clang/lib/StaticAnalyzer')
11 files changed, 28 insertions, 21 deletions
| diff --git a/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp b/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp index bfd4019ed8d..f4d2e32cef1 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp @@ -126,7 +126,7 @@ public:                                       const CallEvent *Call,                                       PointerEscapeKind Kind) const;    void checkPreStmt(const ReturnStmt *RS, CheckerContext &C) const; -  void checkEndFunction(CheckerContext &Ctx) const; +  void checkEndFunction(const ReturnStmt *RS, CheckerContext &Ctx) const;  private:    void diagnoseMissingReleases(CheckerContext &C) const; @@ -398,7 +398,7 @@ void ObjCDeallocChecker::checkPostObjCMessage(  /// Check for missing releases even when -dealloc does not call  /// '[super dealloc]'.  void ObjCDeallocChecker::checkEndFunction( -    CheckerContext &C) const { +    const ReturnStmt *RS, CheckerContext &C) const {    diagnoseMissingReleases(C);  } diff --git a/clang/lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp b/clang/lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp index 495486bf393..7862a4c2568 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp @@ -192,7 +192,7 @@ public:    /// level or is inlined.    ///    /// check::EndFunction -  void checkEndFunction(CheckerContext &Ctx) const {} +  void checkEndFunction(const ReturnStmt *RS, CheckerContext &Ctx) const {}    /// Called after all the paths in the ExplodedGraph reach end of path    /// - the symbolic execution graph is fully explored. diff --git a/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp index 258eb05ca73..19c1d077afa 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp @@ -46,7 +46,7 @@ class MisusedMovedObjectChecker      : public Checker<check::PreCall, check::PostCall, check::EndFunction,                       check::DeadSymbols, check::RegionChanges> {  public: -  void checkEndFunction(CheckerContext &C) const; +  void checkEndFunction(const ReturnStmt *RS, CheckerContext &C) const;    void checkPreCall(const CallEvent &MC, CheckerContext &C) const;    void checkPostCall(const CallEvent &MC, CheckerContext &C) const;    void checkDeadSymbols(SymbolReaper &SR, CheckerContext &C) const; @@ -222,7 +222,8 @@ ExplodedNode *MisusedMovedObjectChecker::reportBug(const MemRegion *Region,  // Removing the function parameters' MemRegion from the state. This is needed  // for PODs where the trivial destructor does not even created nor executed. -void MisusedMovedObjectChecker::checkEndFunction(CheckerContext &C) const { +void MisusedMovedObjectChecker::checkEndFunction(const ReturnStmt *RS, +                                                 CheckerContext &C) const {    auto State = C.getState();    TrackedRegionMapTy Objects = State->get<TrackedRegionMap>();    if (Objects.isEmpty()) diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index 54e87d4094f..2c1e139330d 100644 --- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -2743,7 +2743,7 @@ public:    void checkDeadSymbols(SymbolReaper &SymReaper, CheckerContext &C) const;    void checkBeginFunction(CheckerContext &C) const; -  void checkEndFunction(CheckerContext &C) const; +  void checkEndFunction(const ReturnStmt *RS, CheckerContext &C) const;    ProgramStateRef updateSymbol(ProgramStateRef state, SymbolRef sym,                                 RefVal V, ArgEffect E, RefVal::Kind &hasErr, @@ -3991,7 +3991,8 @@ void RetainCountChecker::checkBeginFunction(CheckerContext &Ctx) const {    Ctx.addTransition(state);  } -void RetainCountChecker::checkEndFunction(CheckerContext &Ctx) const { +void RetainCountChecker::checkEndFunction(const ReturnStmt *RS, +                                          CheckerContext &Ctx) const {    ProgramStateRef state = Ctx.getState();    RefBindingsTy B = state->get<RefBindings>();    ExplodedNode *Pred = Ctx.getPredecessor(); diff --git a/clang/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp index 86936cadd55..feae9e59b34 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp @@ -47,7 +47,7 @@ public:    void checkPreCall(const CallEvent &Call, CheckerContext &C) const;    void checkPreStmt(const ReturnStmt *RS, CheckerContext &C) const; -  void checkEndFunction(CheckerContext &Ctx) const; +  void checkEndFunction(const ReturnStmt *RS, CheckerContext &Ctx) const;  private:    void checkReturnedBlockCaptures(const BlockDataRegion &B, @@ -287,7 +287,8 @@ void StackAddrEscapeChecker::checkPreStmt(const ReturnStmt *RS,    EmitStackError(C, R, RetE);  } -void StackAddrEscapeChecker::checkEndFunction(CheckerContext &Ctx) const { +void StackAddrEscapeChecker::checkEndFunction(const ReturnStmt *RS, +                                              CheckerContext &Ctx) const {    if (!ChecksEnabled[CK_StackAddrEscapeChecker])      return; diff --git a/clang/lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp index eac743349d8..f4c0edbab3f 100644 --- a/clang/lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp @@ -85,7 +85,7 @@ class TestAfterDivZeroChecker  public:    void checkPreStmt(const BinaryOperator *B, CheckerContext &C) const;    void checkBranchCondition(const Stmt *Condition, CheckerContext &C) const; -  void checkEndFunction(CheckerContext &C) const; +  void checkEndFunction(const ReturnStmt *RS, CheckerContext &C) const;    void setDivZeroMap(SVal Var, CheckerContext &C) const;    bool hasDivZeroMap(SVal Var, const CheckerContext &C) const;    bool isZero(SVal S, CheckerContext &C) const; @@ -180,7 +180,8 @@ void TestAfterDivZeroChecker::reportBug(SVal Val, CheckerContext &C) const {    }  } -void TestAfterDivZeroChecker::checkEndFunction(CheckerContext &C) const { +void TestAfterDivZeroChecker::checkEndFunction(const ReturnStmt *RS, +                                               CheckerContext &C) const {    ProgramStateRef State = C.getState();    DivZeroMapTy DivZeroes = State->get<DivZeroMap>(); diff --git a/clang/lib/StaticAnalyzer/Checkers/TraversalChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/TraversalChecker.cpp index 8ad962875b0..ee185b81361 100644 --- a/clang/lib/StaticAnalyzer/Checkers/TraversalChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/TraversalChecker.cpp @@ -30,7 +30,7 @@ class TraversalDumper : public Checker< check::BranchCondition,  public:    void checkBranchCondition(const Stmt *Condition, CheckerContext &C) const;    void checkBeginFunction(CheckerContext &C) const; -  void checkEndFunction(CheckerContext &C) const; +  void checkEndFunction(const ReturnStmt *RS, CheckerContext &C) const;  };  } @@ -56,7 +56,8 @@ void TraversalDumper::checkBeginFunction(CheckerContext &C) const {    llvm::outs() << "--BEGIN FUNCTION--\n";  } -void TraversalDumper::checkEndFunction(CheckerContext &C) const { +void TraversalDumper::checkEndFunction(const ReturnStmt *RS, +                                       CheckerContext &C) const {    llvm::outs() << "--END FUNCTION--\n";  } diff --git a/clang/lib/StaticAnalyzer/Checkers/UninitializedObjectChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/UninitializedObjectChecker.cpp index 5c94a5bd337..398228a9d88 100644 --- a/clang/lib/StaticAnalyzer/Checkers/UninitializedObjectChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/UninitializedObjectChecker.cpp @@ -47,7 +47,7 @@ public:    UninitializedObjectChecker()        : BT_uninitField(new BuiltinBug(this, "Uninitialized fields")) {} -  void checkEndFunction(CheckerContext &C) const; +  void checkEndFunction(const ReturnStmt *RS, CheckerContext &C) const;  };  /// Represents a field chain. A field chain is a vector of fields where the @@ -241,7 +241,7 @@ static StringRef getVariableName(const FieldDecl *Field);  //===----------------------------------------------------------------------===//  void UninitializedObjectChecker::checkEndFunction( -    CheckerContext &Context) const { +    const ReturnStmt *RS, CheckerContext &Context) const {    const auto *CtorDecl = dyn_cast_or_null<CXXConstructorDecl>(        Context.getLocationContext()->getDecl()); diff --git a/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp index ec5afa5134a..5b602468cdd 100644 --- a/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp @@ -48,7 +48,7 @@ public:    DefaultBool IsPureOnly;    void checkBeginFunction(CheckerContext &C) const; -  void checkEndFunction(CheckerContext &C) const; +  void checkEndFunction(const ReturnStmt *RS, CheckerContext &C) const;    void checkPreCall(const CallEvent &Call, CheckerContext &C) const;  private: @@ -167,7 +167,8 @@ void VirtualCallChecker::checkBeginFunction(CheckerContext &C) const {  }  // The EndFunction callback when leave a constructor or a destructor. -void VirtualCallChecker::checkEndFunction(CheckerContext &C) const { +void VirtualCallChecker::checkEndFunction(const ReturnStmt *RS, +                                          CheckerContext &C) const {    registerCtorDtorCallInState(false, C);  } diff --git a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp index e355fa28eaf..712872a15d8 100644 --- a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp @@ -439,7 +439,8 @@ void CheckerManager::runCheckersForBeginFunction(ExplodedNodeSet &Dst,  void CheckerManager::runCheckersForEndFunction(NodeBuilderContext &BC,                                                 ExplodedNodeSet &Dst,                                                 ExplodedNode *Pred, -                                               ExprEngine &Eng) { +                                               ExprEngine &Eng, +                                               const ReturnStmt *RS) {    // We define the builder outside of the loop bacause if at least one checkers    // creates a sucsessor for Pred, we do not need to generate an    // autotransition for it. @@ -449,7 +450,7 @@ void CheckerManager::runCheckersForEndFunction(NodeBuilderContext &BC,                                            Pred->getLocationContext(),                                            checkFn.Checker);      CheckerContext C(Bldr, Eng, Pred, L); -    checkFn(C); +    checkFn(RS, C);    }  } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 27f7553e7ae..188316c096e 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -2297,9 +2297,9 @@ void ExprEngine::processEndOfFunction(NodeBuilderContext& BC,      // Notify checkers.      for (const auto I : AfterRemovedDead) -      getCheckerManager().runCheckersForEndFunction(BC, Dst, I, *this); +      getCheckerManager().runCheckersForEndFunction(BC, Dst, I, *this, RS);    } else { -    getCheckerManager().runCheckersForEndFunction(BC, Dst, Pred, *this); +    getCheckerManager().runCheckersForEndFunction(BC, Dst, Pred, *this, RS);    }    Engine.enqueueEndOfFunction(Dst, RS); | 

