diff options
| author | Adam Balogh <adam.balogh@ericsson.com> | 2018-08-28 08:41:15 +0000 |
|---|---|---|
| committer | Adam Balogh <adam.balogh@ericsson.com> | 2018-08-28 08:41:15 +0000 |
| commit | 2cfbe933a133aac80052cb8707c11b9beff4cc26 (patch) | |
| tree | d2d5f0d42d8017bc713fad9fd4137f5c4fa019bf /clang/test | |
| parent | a46d08ebe6f21553d9f998b658a2f210940649af (diff) | |
| download | bcm5719-llvm-2cfbe933a133aac80052cb8707c11b9beff4cc26.tar.gz bcm5719-llvm-2cfbe933a133aac80052cb8707c11b9beff4cc26.zip | |
[Analyzer] Iterator Checker - Part 3: Invalidation check, first for (copy) assignments
We add check for invalidation of iterators. The only operation we handle here
is the (copy) assignment.
Differential Revision: https://reviews.llvm.org/D32747
llvm-svn: 340805
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Analysis/Inputs/system-header-simulator-cxx.h | 46 | ||||
| -rw-r--r-- | clang/test/Analysis/diagnostics/explicit-suppression.cpp | 2 | ||||
| -rw-r--r-- | clang/test/Analysis/invalidated-iterator.cpp | 32 |
3 files changed, 76 insertions, 4 deletions
diff --git a/clang/test/Analysis/Inputs/system-header-simulator-cxx.h b/clang/test/Analysis/Inputs/system-header-simulator-cxx.h index 5d7e553ed5f..468de9211a5 100644 --- a/clang/test/Analysis/Inputs/system-header-simulator-cxx.h +++ b/clang/test/Analysis/Inputs/system-header-simulator-cxx.h @@ -252,6 +252,15 @@ namespace std { return size_t(_finish - _start); } + vector& operator=(const vector &other); + vector& operator=(vector &&other); + vector& operator=(std::initializer_list<T> ilist); + + void assign(size_type count, const T &value); + template <typename InputIterator > + void assign(InputIterator first, InputIterator last); + void assign(std::initializer_list<T> ilist); + void clear(); void push_back(const T &value); @@ -301,8 +310,21 @@ namespace std { list& operator=(list &&other); list& operator=(std::initializer_list<T> ilist); + void assign(size_type count, const T &value); + template <typename InputIterator > + void assign(InputIterator first, InputIterator last); + void assign(std::initializer_list<T> ilist); + void clear(); + void push_back(const T &value); + void push_back(T &&value); + void pop_back(); + + void push_front(const T &value); + void push_front(T &&value); + void pop_front(); + iterator begin() { return iterator(_start); } const_iterator begin() const { return const_iterator(_start); } const_iterator cbegin() const { return const_iterator(_start); } @@ -338,6 +360,15 @@ namespace std { return size_t(_finish - _start); } + deque& operator=(const deque &other); + deque& operator=(deque &&other); + deque& operator=(std::initializer_list<T> ilist); + + void assign(size_type count, const T &value); + template <typename InputIterator > + void assign(InputIterator first, InputIterator last); + void assign(std::initializer_list<T> ilist); + void clear(); void push_back(const T &value); @@ -351,11 +382,11 @@ namespace std { T &operator[](size_t n) { return _start[n]; } - + const T &operator[](size_t n) const { return _start[n]; } - + iterator begin() { return iterator(_start); } const_iterator begin() const { return const_iterator(_start); } const_iterator cbegin() const { return const_iterator(_start); } @@ -367,7 +398,7 @@ namespace std { T& back() { return *(end() - 1); } const T& back() const { return *(end() - 1); } }; - + template<typename T> class forward_list { struct __item { @@ -387,6 +418,15 @@ namespace std { forward_list(forward_list &&other); ~forward_list(); + forward_list& operator=(const forward_list &other); + forward_list& operator=(forward_list &&other); + forward_list& operator=(std::initializer_list<T> ilist); + + void assign(size_type count, const T &value); + template <typename InputIterator > + void assign(InputIterator first, InputIterator last); + void assign(std::initializer_list<T> ilist); + void clear(); void push_front(const T &value); diff --git a/clang/test/Analysis/diagnostics/explicit-suppression.cpp b/clang/test/Analysis/diagnostics/explicit-suppression.cpp index 092591836ba..84929aabe3a 100644 --- a/clang/test/Analysis/diagnostics/explicit-suppression.cpp +++ b/clang/test/Analysis/diagnostics/explicit-suppression.cpp @@ -19,6 +19,6 @@ class C { void testCopyNull(C *I, C *E) { std::copy(I, E, (C *)0); #ifndef SUPPRESSED - // expected-warning@../Inputs/system-header-simulator-cxx.h:514 {{Called C++ object pointer is null}} + // expected-warning@../Inputs/system-header-simulator-cxx.h:554 {{Called C++ object pointer is null}} #endif } diff --git a/clang/test/Analysis/invalidated-iterator.cpp b/clang/test/Analysis/invalidated-iterator.cpp new file mode 100644 index 00000000000..78240dfdd5f --- /dev/null +++ b/clang/test/Analysis/invalidated-iterator.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.InvalidatedIterator -analyzer-eagerly-assume -analyzer-config aggressive-relational-comparison-simplification=true -analyzer-config c++-container-inlining=false %s -verify +// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.InvalidatedIterator -analyzer-eagerly-assume -analyzer-config aggressive-relational-comparison-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 %s -verify + +#include "Inputs/system-header-simulator-cxx.h" + +void bad_copy_assign_operator_list1(std::list<int> &L1, + const std::list<int> &L2) { + auto i0 = L1.cbegin(); + L1 = L2; + *i0; // expected-warning{{Invalidated iterator accessed}} +} + +void bad_copy_assign_operator_vector1(std::vector<int> &V1, + const std::vector<int> &V2) { + auto i0 = V1.cbegin(); + V1 = V2; + *i0; // expected-warning{{Invalidated iterator accessed}} +} + +void bad_copy_assign_operator_deque1(std::deque<int> &D1, + const std::deque<int> &D2) { + auto i0 = D1.cbegin(); + D1 = D2; + *i0; // expected-warning{{Invalidated iterator accessed}} +} + +void bad_copy_assign_operator_forward_list1(std::forward_list<int> &FL1, + const std::forward_list<int> &FL2) { + auto i0 = FL1.cbegin(); + FL1 = FL2; + *i0; // expected-warning{{Invalidated iterator accessed}} +} |

