[Analyzer] Iterator Checker - Forbid decrements past the begin() and increments past...
authorAdam Balogh <adam.balogh@ericsson.com>
Tue, 4 Dec 2018 10:27:27 +0000 (10:27 +0000)
committerAdam Balogh <adam.balogh@ericsson.com>
Tue, 4 Dec 2018 10:27:27 +0000 (10:27 +0000)
commitd5bd3f6354294605ccdf868d1f3d0ff6913fdab6
treef18cd1e5917a7ede49ca2972cddb0ff3e8907f35
parent42d241fc0b25d71c4c048019a25e286b8bd4bb6f
[Analyzer] Iterator Checker - Forbid decrements past the begin() and increments past the end() of containers

Previously, the iterator range checker only warned upon dereferencing of
iterators outside their valid range as well as increments and decrements of
out-of-range iterators where the result remains out-of-range. However, the C++
standard is more strict than this: decrementing begin() or incrementing end()
results in undefined behaviour even if the iterator is not dereferenced
afterwards. Coming back to the range once out-of-range is also undefined.

This patch corrects the behaviour of the iterator range checker: warnings are
given for any operation whose result is ahead of begin() or past the end()
(which is the past-end iterator itself, thus now we are speaking of past
past-the-end).

Differential Revision: https://reviews.llvm.org/D53812

llvm-svn: 348245
clang/lib/StaticAnalyzer/Checkers/IteratorChecker.cpp
clang/test/Analysis/iterator-range.cpp