[PATCH] D49387: [analyzer] Make checkEndFunction() give access to the return statement
This revision was automatically updated to reflect the committed changes. Closed by commit rL337215: [analyzer] Make checkEndFunction() give access to the return statement. (authored by rkovacs, committed by ). Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D49387?vs=155713=155757#toc Repository: rL LLVM https://reviews.llvm.org/D49387 Files: cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h cfe/trunk/include/clang/StaticAnalyzer/Core/CheckerManager.h cfe/trunk/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/TraversalChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObjectChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Index: cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp === --- cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp @@ -439,7 +439,8 @@ void CheckerManager::runCheckersForEndFunction(NodeBuilderContext , ExplodedNodeSet , ExplodedNode *Pred, - ExprEngine ) { + ExprEngine , + 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 @@ Pred->getLocationContext(), checkFn.Checker); CheckerContext C(Bldr, Eng, Pred, L); -checkFn(C); +checkFn(RS, C); } } Index: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp === --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -2297,9 +2297,9 @@ // 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); Index: cfe/trunk/lib/StaticAnalyzer/Checkers/TraversalChecker.cpp === --- cfe/trunk/lib/StaticAnalyzer/Checkers/TraversalChecker.cpp +++ cfe/trunk/lib/StaticAnalyzer/Checkers/TraversalChecker.cpp @@ -30,7 +30,7 @@ public: void checkBranchCondition(const Stmt *Condition, CheckerContext ) const; void checkBeginFunction(CheckerContext ) const; - void checkEndFunction(CheckerContext ) const; + void checkEndFunction(const ReturnStmt *RS, CheckerContext ) const; }; } @@ -56,7 +56,8 @@ llvm::outs() << "--BEGIN FUNCTION--\n"; } -void TraversalDumper::checkEndFunction(CheckerContext ) const { +void TraversalDumper::checkEndFunction(const ReturnStmt *RS, + CheckerContext ) const { llvm::outs() << "--END FUNCTION--\n"; } Index: cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp === --- cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -2743,7 +2743,7 @@ void checkDeadSymbols(SymbolReaper , CheckerContext ) const; void checkBeginFunction(CheckerContext ) const; - void checkEndFunction(CheckerContext ) const; + void checkEndFunction(const ReturnStmt *RS, CheckerContext ) const; ProgramStateRef updateSymbol(ProgramStateRef state, SymbolRef sym, RefVal V, ArgEffect E, RefVal::Kind , @@ -3991,7 +3991,8 @@ Ctx.addTransition(state); } -void RetainCountChecker::checkEndFunction(CheckerContext ) const { +void RetainCountChecker::checkEndFunction(const ReturnStmt *RS, + CheckerContext ) const { ProgramStateRef state = Ctx.getState(); RefBindingsTy B = state->get(); ExplodedNode *Pred = Ctx.getPredecessor(); Index: cfe/trunk/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp
[PATCH] D49387: [analyzer] Make checkEndFunction() give access to the return statement
NoQ accepted this revision. NoQ added a comment. This revision is now accepted and ready to land. Looks great, thanks! Comment at: include/clang/StaticAnalyzer/Core/CheckerManager.h:501 - void _registerForBeginFunction(CheckEndFunctionFunc checkfn); + void _registerForBeginFunction(CheckBeginFunctionFunc checkfn); void _registerForEndFunction(CheckEndFunctionFunc checkfn); :D Repository: rC Clang https://reviews.llvm.org/D49387 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D49387: [analyzer] Make checkEndFunction() give access to the return statement
rnkovacs created this revision. rnkovacs added reviewers: NoQ, xazax.hun, george.karpenkov. Herald added subscribers: mikhail.ramalho, a.sidorin, dkrupp, szepet, baloghadamsoftware, whisperity. Repository: rC Clang https://reviews.llvm.org/D49387 Files: include/clang/StaticAnalyzer/Core/Checker.h include/clang/StaticAnalyzer/Core/CheckerManager.h lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp lib/StaticAnalyzer/Checkers/TestAfterDivZeroChecker.cpp lib/StaticAnalyzer/Checkers/TraversalChecker.cpp lib/StaticAnalyzer/Checkers/UninitializedObjectChecker.cpp lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp lib/StaticAnalyzer/Core/CheckerManager.cpp lib/StaticAnalyzer/Core/ExprEngine.cpp Index: lib/StaticAnalyzer/Core/ExprEngine.cpp === --- lib/StaticAnalyzer/Core/ExprEngine.cpp +++ lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -2297,9 +2297,9 @@ // 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); Index: lib/StaticAnalyzer/Core/CheckerManager.cpp === --- lib/StaticAnalyzer/Core/CheckerManager.cpp +++ lib/StaticAnalyzer/Core/CheckerManager.cpp @@ -439,7 +439,8 @@ void CheckerManager::runCheckersForEndFunction(NodeBuilderContext , ExplodedNodeSet , ExplodedNode *Pred, - ExprEngine ) { + ExprEngine , + 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 @@ Pred->getLocationContext(), checkFn.Checker); CheckerContext C(Bldr, Eng, Pred, L); -checkFn(C); +checkFn(RS, C); } } Index: lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp === --- lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp +++ lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp @@ -48,7 +48,7 @@ DefaultBool IsPureOnly; void checkBeginFunction(CheckerContext ) const; - void checkEndFunction(CheckerContext ) const; + void checkEndFunction(const ReturnStmt *RS, CheckerContext ) const; void checkPreCall(const CallEvent , CheckerContext ) const; private: @@ -167,7 +167,8 @@ } // The EndFunction callback when leave a constructor or a destructor. -void VirtualCallChecker::checkEndFunction(CheckerContext ) const { +void VirtualCallChecker::checkEndFunction(const ReturnStmt *RS, + CheckerContext ) const { registerCtorDtorCallInState(false, C); } Index: lib/StaticAnalyzer/Checkers/UninitializedObjectChecker.cpp === --- lib/StaticAnalyzer/Checkers/UninitializedObjectChecker.cpp +++ lib/StaticAnalyzer/Checkers/UninitializedObjectChecker.cpp @@ -47,7 +47,7 @@ UninitializedObjectChecker() : BT_uninitField(new BuiltinBug(this, "Uninitialized fields")) {} - void checkEndFunction(CheckerContext ) const; + void checkEndFunction(const ReturnStmt *RS, CheckerContext ) const; }; /// Represents a field chain. A field chain is a vector of fields where the @@ -241,7 +241,7 @@ //===--===// void UninitializedObjectChecker::checkEndFunction( -CheckerContext ) const { +const ReturnStmt *RS, CheckerContext ) const { const auto *CtorDecl = dyn_cast_or_null( Context.getLocationContext()->getDecl()); Index: lib/StaticAnalyzer/Checkers/TraversalChecker.cpp === --- lib/StaticAnalyzer/Checkers/TraversalChecker.cpp +++ lib/StaticAnalyzer/Checkers/TraversalChecker.cpp @@ -30,7 +30,7 @@ public: void checkBranchCondition(const Stmt *Condition, CheckerContext ) const; void checkBeginFunction(CheckerContext ) const; - void checkEndFunction(CheckerContext ) const; + void checkEndFunction(const ReturnStmt *RS, CheckerContext ) const; }; } @@ -56,7 +56,8 @@ llvm::outs() <<