[PATCH] D32642: [Analyzer] Iterator Checker - Part 2: Increment, decrement operators and ahead-of-begin checks

Artem Dergachev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 27 12:11:56 PDT 2018


NoQ added a comment.

I think this looks good. There's a problem with missing construction contexts, but i guess that's not the checker's fault, so let's add a FIXME and commit.



================
Comment at: lib/StaticAnalyzer/Checkers/IteratorChecker.cpp:454-455
+      return;
+    const auto OldState = C.getPredecessor()->getFirstPred()->getState();
+    const auto OldThis = OldState->getSVal(ThisExpr, LCtx);
+    const auto *Pos = getIteratorPosition(OldState, OldThis);
----------------
This deserves a FIXME because that's definitely unreliable (i.e. if another checker subscribes to the operator call and adds a transition before you, you'll break because you'd have to ascend two nodes above, not one).

The proper fix is to make the CFG provide a `ConstructionContext` for the `CXXOperatorCallExpr`, which would turn the corresponding `CFGStmt` element into a `CFGCXXRecordTypedCall` element, which will allow `ExprEngine` to foresee that the `begin()`/`end()` call constructs the object directly in the temporary region that `CXXOperatorCallExpr` takes as its implicit object argument.

The proper fix is not hard, but there are still a lot of simpler and more common cases that we don't handle.


================
Comment at: lib/StaticAnalyzer/Checkers/IteratorChecker.cpp:476-502
+void IteratorChecker::checkLiveSymbols(ProgramStateRef State,
+                                       SymbolReaper &SR) const {
+  // Keep symbolic expressions of iterator positions, container begins and ends
+  // alive
+  auto RegionMap = State->get<IteratorRegionMap>();
+  for (const auto Reg : RegionMap) {
+    const auto Pos = Reg.second;
----------------
I guess we'll have this sorted out in another patch.


https://reviews.llvm.org/D32642





More information about the cfe-commits mailing list