[PATCH] D62440: [analyzer] NFC: Change evalCall() to provide a CallEvent.
This revision was automatically updated to reflect the committed changes. Closed by commit rL363893: [analyzer] NFC: Change evalCall() to provide a CallEvent. (authored by dergachev, committed by ). Herald added a project: LLVM. Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D62440?vs=201380=205701#toc Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D62440/new/ https://reviews.llvm.org/D62440 Files: cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h cfe/trunk/include/clang/StaticAnalyzer/Core/CheckerManager.h cfe/trunk/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/ChrootChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.h cfe/trunk/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/StreamChecker.cpp cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp Index: cfe/trunk/include/clang/StaticAnalyzer/Core/CheckerManager.h === --- cfe/trunk/include/clang/StaticAnalyzer/Core/CheckerManager.h +++ cfe/trunk/include/clang/StaticAnalyzer/Core/CheckerManager.h @@ -490,7 +490,7 @@ CheckerFn; - using EvalCallFunc = CheckerFn; + using EvalCallFunc = CheckerFn; using CheckEndOfTranslationUnit = CheckerFn - static bool _evalCall(void *checker, const CallExpr *CE, CheckerContext ) { -return ((const CHECKER *)checker)->evalCall(CE, C); + static bool _evalCall(void *checker, const CallEvent , +CheckerContext ) { +return ((const CHECKER *)checker)->evalCall(Call, C); } public: Index: cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp === --- cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp @@ -651,7 +651,6 @@ const ExplodedNodeSet , const CallEvent , ExprEngine ) { - const CallExpr *CE = cast(Call.getOriginExpr()); for (const auto Pred : Src) { bool anyEvaluated = false; @@ -660,16 +659,19 @@ // Check if any of the EvalCall callbacks can evaluate the call. for (const auto EvalCallChecker : EvalCallCheckers) { - ProgramPoint::Kind K = ProgramPoint::PostStmtKind; - const ProgramPoint = - ProgramPoint::getProgramPoint(CE, K, Pred->getLocationContext(), -EvalCallChecker.Checker); + // TODO: Support the situation when the call doesn't correspond + // to any Expr. + ProgramPoint L = ProgramPoint::getProgramPoint( + cast(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 // populated. CheckerContext C(B, Eng, Pred, L); -evaluated = EvalCallChecker(CE, C); +evaluated = EvalCallChecker(Call, C); } assert(!(evaluated && anyEvaluated) && "There are more than one checkers evaluating the call"); Index: cfe/trunk/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp === --- cfe/trunk/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp +++ cfe/trunk/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp @@ -11,6 +11,7 @@ #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" #include "clang/StaticAnalyzer/Core/Checker.h" #include "clang/StaticAnalyzer/Core/IssueHash.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/ScopedPrinter.h" @@ -53,7 +54,7 @@ ExplodedNode *N) const; public: - bool evalCall(const CallExpr *CE, CheckerContext ) const; + bool evalCall(const CallEvent , CheckerContext ) const; void checkDeadSymbols(SymbolReaper , CheckerContext ) const; void checkEndAnalysis(ExplodedGraph , BugReporter , ExprEngine ) const; @@ -63,8 +64,12 @@ REGISTER_SET_WITH_PROGRAMSTATE(MarkedSymbols, SymbolRef) REGISTER_MAP_WITH_PROGRAMSTATE(DenotedSymbols, SymbolRef, const StringLiteral *) -bool ExprInspectionChecker::evalCall(const CallExpr *CE, +bool
[PATCH] D62440: [analyzer] NFC: Change evalCall() to provide a CallEvent.
Szelethus accepted this revision. Szelethus added a comment. LGTM! Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D62440/new/ https://reviews.llvm.org/D62440 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D62440: [analyzer] NFC: Change evalCall() to provide a CallEvent.
NoQ marked an inline comment as done. NoQ added inline comments. Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:372 CheckerContext ) const { - const FunctionDecl *FD = dyn_cast_or_null(CE->getCalleeDecl()); + const auto *FD = dyn_cast_or_null(Call.getDecl()); if (!FD) a_sidorin wrote: > Should we create helpers similar to getDecl() and getOriginExpr > (getFunctionDecl/getCallExpr)? Generally it sounds like a good idea, but in the context of this patch it's only useful when i don't want to refactor the code to avoid needing such getters in the first place. Once the `CallDescription` interface is good enough, all such getters will turn into hard casts without null checks. But these two checkers implement their own custom call description facility, so they need this sort of dancing. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D62440/new/ https://reviews.llvm.org/D62440 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D62440: [analyzer] NFC: Change evalCall() to provide a CallEvent.
a_sidorin accepted this revision. a_sidorin added inline comments. This revision is now accepted and ready to land. Comment at: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp:372 CheckerContext ) const { - const FunctionDecl *FD = dyn_cast_or_null(CE->getCalleeDecl()); + const auto *FD = dyn_cast_or_null(Call.getDecl()); if (!FD) Should we create helpers similar to getDecl() and getOriginExpr (getFunctionDecl/getCallExpr)? Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D62440/new/ https://reviews.llvm.org/D62440 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D62440: [analyzer] NFC: Change evalCall() to provide a CallEvent.
NoQ created this revision. NoQ added reviewers: dcoughlin, xazax.hun, a_sidorin, rnkovacs, mikhail.ramalho, Szelethus, baloghadamsoftware, Charusso. Herald added subscribers: cfe-commits, dkrupp, donat.nagy, a.sidorin, szepet. Herald added a project: clang. This is mostly motivated by me being annoyed that in C many functions are implemented as builtins and everybody keeps forgetting about it while writing checkers, leading to checkers not working at all except on LIT tests, which is fairly hard to notice. This is also a necessary step if we want to `evalCall()` calls that don't correspond to any `CallExpr`, such as automatic destructor calls. Repository: rC Clang https://reviews.llvm.org/D62440 Files: clang/include/clang/StaticAnalyzer/Core/Checker.h clang/include/clang/StaticAnalyzer/Core/CheckerManager.h clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp clang/lib/StaticAnalyzer/Checkers/ChrootChecker.cpp clang/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.h clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp clang/lib/StaticAnalyzer/Core/CheckerManager.cpp Index: clang/lib/StaticAnalyzer/Core/CheckerManager.cpp === --- clang/lib/StaticAnalyzer/Core/CheckerManager.cpp +++ clang/lib/StaticAnalyzer/Core/CheckerManager.cpp @@ -650,7 +650,6 @@ const ExplodedNodeSet , const CallEvent , ExprEngine ) { - const CallExpr *CE = cast(Call.getOriginExpr()); for (const auto Pred : Src) { bool anyEvaluated = false; @@ -659,16 +658,19 @@ // Check if any of the EvalCall callbacks can evaluate the call. for (const auto EvalCallChecker : EvalCallCheckers) { - ProgramPoint::Kind K = ProgramPoint::PostStmtKind; - const ProgramPoint = - ProgramPoint::getProgramPoint(CE, K, Pred->getLocationContext(), -EvalCallChecker.Checker); + // TODO: Support the situation when the call doesn't correspond + // to any Expr. + ProgramPoint L = ProgramPoint::getProgramPoint( + cast(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 // populated. CheckerContext C(B, Eng, Pred, L); -evaluated = EvalCallChecker(CE, C); +evaluated = EvalCallChecker(Call, C); } assert(!(evaluated && anyEvaluated) && "There are more than one checkers evaluating the call"); Index: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp === --- clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -14,6 +14,7 @@ #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" #include "clang/StaticAnalyzer/Core/Checker.h" #include "clang/StaticAnalyzer/Core/CheckerManager.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h" @@ -71,7 +72,7 @@ II_fsetpos(nullptr), II_clearerr(nullptr), II_feof(nullptr), II_ferror(nullptr), II_fileno(nullptr) {} - bool evalCall(const CallExpr *CE, CheckerContext ) const; + bool evalCall(const CallEvent , CheckerContext ) const; void checkDeadSymbols(SymbolReaper , CheckerContext ) const; private: @@ -103,11 +104,15 @@ REGISTER_MAP_WITH_PROGRAMSTATE(StreamMap, SymbolRef, StreamState) -bool StreamChecker::evalCall(const CallExpr *CE, CheckerContext ) const { - const FunctionDecl *FD = C.getCalleeDecl(CE); +bool StreamChecker::evalCall(const CallEvent , CheckerContext ) const { + const auto *FD = dyn_cast_or_null(Call.getDecl()); if (!FD || FD->getKind() != Decl::Function) return false; + const auto *CE = dyn_cast_or_null(Call.getOriginExpr()); + if (!CE) +return false; + ASTContext = C.getASTContext(); if (!II_fopen) II_fopen = ("fopen"); Index: clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp === --- clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp +++