[PATCH] D62440: [analyzer] NFC: Change evalCall() to provide a CallEvent.

2019-06-19 Thread Phabricator via Phabricator via cfe-commits
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.

2019-06-03 Thread Kristóf Umann via Phabricator via cfe-commits
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.

2019-05-28 Thread Artem Dergachev via Phabricator via cfe-commits
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.

2019-05-26 Thread Aleksei Sidorin via Phabricator via cfe-commits
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.

2019-05-24 Thread Artem Dergachev via Phabricator via cfe-commits
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
+++