[PATCH] D28771: [Analyzer] Various fixes for the IteratorPastEnd checker

Artem Dergachev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 20 09:13:40 PST 2017


NoQ added a comment.

Thanks for the update, most welcome!



================
Comment at: lib/StaticAnalyzer/Checkers/IteratorPastEndChecker.cpp:234
+        if (Call.getNumArgs() >= 1) {
+          const auto &InstCall = static_cast<const CXXInstanceCall &>(Call);
+          handleRandomIncrOrDecr(C, Func->getOverloadedOperator(),
----------------
We usually write these as
```
const auto *InstCall = cast<CXXInstanceCall>(&Call);
```
Mostly because our custom `cast<>` has an assertion inside.


================
Comment at: lib/StaticAnalyzer/Checkers/IteratorPastEndChecker.cpp:514
+    CheckerContext &C, OverloadedOperatorKind Op, const SVal &RetVal,
+    const SVal &LVal, const SVal &RVal, QualType RValType,
+    bool PreCheck) const {
----------------
I'd suggest renaming the parameters to "LHS" and "RHS" or something like that, so that not to confuse those with "lvalue" and "rvalue".


================
Comment at: lib/StaticAnalyzer/Checkers/IteratorPastEndChecker.cpp:530
+  auto value = RVal;
+  if (auto loc = value.getAs<Loc>()) {
+    value = State->getRawSVal(*loc);
----------------
Is there a test case for this hack?

I'd also consider inspecting the AST (probably before passing the values to `handleRandomIncrOrDecr()`) and making the decision based on that. Because even though this pattern ("if a value is a loc and we expect a nonloc, do an extra dereference") is present in many places in the analyzer, in most of these places it doesn't work correctly (what if we try to discriminate between `int*` and `int*&`?).


================
Comment at: lib/StaticAnalyzer/Checkers/IteratorPastEndChecker.cpp:553
+
+  // When increasing by positive or decreasing by negative an iterator past its
+  // end, then it is a bug. We check for bugs before the operator call.
----------------
I think incrementing `end()` by `0` is not a bug (?)


https://reviews.llvm.org/D28771





More information about the cfe-commits mailing list