[PATCH] D34275: [analyzer] Re-implemente current virtual calls checker in a path-sensitive way

Gábor Horváth via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 14 06:21:42 PDT 2017


xazax.hun added inline comments.


================
Comment at: lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp:72
+REGISTER_MAP_WITH_PROGRAMSTATE(CtorMap, const MemRegion *, bool)
+REGISTER_MAP_WITH_PROGRAMSTATE(DtorMap, const MemRegion *, bool)
+
----------------
I was wondering if there is another way to represent the state.
We could have a two element (bool based) enum class like:
```
enum class ObjectState : bool {
  CtorCalled,
  DtorCalled
};
```

Se we could have only one map in the GDM. Either the destructor is called for an object or the constructor.  Or in case none of them is called on a path, the state is empty. What do you think? 



================
Comment at: lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp:86
+  const LocationContext *LCtx = N->getLocationContext();
+  ProgramStateManager &PSM = State->getStateManager();
+  auto &SVB = PSM.getSValBuilder();
----------------
You could move the declarations of PSM and SVB after the next early return. 


================
Comment at: lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp:107
+
+  std::string DeclName;
+  std::string InfoText;
----------------
You could eliminate this local variable. 


================
Comment at: lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp:169
 
-  // FIXME: The interprocedural diagnostic experience here is not good.
-  // Ultimately this checker should be re-written to be path sensitive.
-  // For now, only diagnose intraprocedurally, by default.
-  if (IsInterprocedural) {
-    os << "Call Path : ";
-    // Name of current visiting CallExpr.
-    os << *CE->getDirectCallee();
-
-    // Name of the CallExpr whose body is current being walked.
-    if (visitingCallExpr)
-      os << " <-- " << *visitingCallExpr->getDirectCallee();
-    // Names of FunctionDecls in worklist with state PostVisited.
-    for (SmallVectorImpl<const CallExpr *>::iterator I = WList.end(),
-         E = WList.begin(); I != E; --I) {
-      const FunctionDecl *FD = (*(I-1))->getDirectCallee();
-      assert(FD);
-      if (VisitedFunctions[FD] == PostVisited)
-        os << " <-- " << *FD;
-    }
+  if (IsPureOnly && !MD->isPure())
+    return;
----------------
These two checks could be moved before you query the CXXThisVal. 


================
Comment at: lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp:247
+  C.emitReport(std::move(Reporter));
+  return;
 }
----------------
This return is redundant. 


https://reviews.llvm.org/D34275





More information about the cfe-commits mailing list