[PATCH] D32845: [Analyzer] Iterator Checker - Part 4: Mismatched iterator checker for function parameters
Aleksei Sidorin via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 16 05:45:45 PST 2018
a.sidorin added a comment.
Hello Adam,
This looks like a nice improvement. I have some remarks inline.
================
Comment at: lib/StaticAnalyzer/Checkers/IteratorChecker.cpp:382
}
+ } else if (!isa<CXXConstructorCall>(&Call)) {
+ // The main purpose of iterators is to abstract away from different
----------------
The function becomes > 100 lines long. Should we refactor this check into a separate function to improve readability?
================
Comment at: lib/StaticAnalyzer/Checkers/IteratorChecker.cpp:388
+ // template parameters for different containers. So we can safely
+ // assume that passing iterators of different containers as arguments
+ // whose type replaces the same template parameter is a bug.
----------------
While this assumption is sane and is true for <algorithm> functions, user code can have other design solutions. There is nothing that prevents users from writing a function looking like:
```
template <typename IterTy>
void f(IterTy FromBegin, IterTy FromEnd, IterTy ToBegin, IterTy ToEnd);
```
and there is nothing wrong with it.
One of possible solutions is to restrict checker to check only functions from std namespace. What do you think?
================
Comment at: lib/StaticAnalyzer/Checkers/IteratorChecker.cpp:410
+ // Iterate over all the template parameters
+ for (auto i = 0U; i < TParams->size(); ++i) {
+ const auto *TPDecl = dyn_cast<TemplateTypeParmDecl>(TParams->getParam(i));
----------------
size_t I = 0?
================
Comment at: lib/StaticAnalyzer/Checkers/IteratorChecker.cpp:924
+ }
+ reportMismatchedBug("Iterator access mismatched.", Iter1, C, N);
+ }
----------------
We always report about first iterator, but the mismatched one can be second. I think this deserves a FIXME, at least.
================
Comment at: lib/StaticAnalyzer/Checkers/IteratorChecker.cpp:1025
+void IteratorChecker::reportMismatchedBug(const StringRef &Message,
+ const SVal &Val, CheckerContext &C,
----------------
We usually pass StringRefs and SVals by value because they're very cheap for copying. However, the surrounding code follows the same conventions so it's not strongly required to change.
https://reviews.llvm.org/D32845
More information about the cfe-commits
mailing list