[PATCH] D47554: [analyzer] Check for dead/impossible status checks

Artem Dergachev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 13 15:02:09 PDT 2018


NoQ added a comment.

Thanks for adding me!

Hmm, i think a matcher-based solution would be pretty limited. This is definitely your typical all-path data-flow problem because you want to make sure that you're looking at the //last// assignment to the variable.

For example:

  int *m = new int;
  m = nullptr;
  if (m == nullptr) { ... } // no-warning

but

  int *m = nullptr;
  m = new int;
  if (m == nullptr) { ... } // expected-warning{{}}

You might be able to fix false positives by adding a condition that the variable is not re-assigned within the function (with the help of assignment operator or due to taking a non-constant reference to it, etc). But you'll end up with a checker that finds a lot less bugs than a full-featured data flow analysis could have found. There's a canonical implementation of "the variable is not modified" check via ASTMatchers in `LoopUnrolling.cpp`.

If you'll ever want to find a full-featured data flow check, i'm not sure but you might be able to re-use `LiveVariables` analysis (the non-`Relaxed` one) to find the last assignment, and in this case you won't have to write data flow analysis yourself. `DeadStores` checker has an example of that.


Repository:
  rC Clang

https://reviews.llvm.org/D47554





More information about the cfe-commits mailing list