blob: 4505aedd4e3616f13c913b77003ffee252446860 [file] [log] [blame]
Adam Balogh21583b72018-09-10 09:03:22 +00001// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.InvalidatedIterator -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=false %s -verify
2// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.InvalidatedIterator -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 %s -verify
Adam Balogh2cfbe932018-08-28 08:41:15 +00003
4#include "Inputs/system-header-simulator-cxx.h"
5
Adam Balogh12f5c7f2019-08-29 09:35:47 +00006void clang_analyzer_warnIfReached();
7
Adam Balogh23022b92019-11-08 12:52:09 +01008void normal_dereference(std::vector<int> &V) {
9 auto i = V.cbegin();
10 *i; // no-warning
Adam Balogh2cfbe932018-08-28 08:41:15 +000011}
12
Adam Balogh23022b92019-11-08 12:52:09 +010013void invalidated_dereference(std::vector<int> &V) {
14 auto i = V.cbegin();
15 V.erase(i);
16 *i; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2cfbe932018-08-28 08:41:15 +000017}
18
Adam Balogh23022b92019-11-08 12:52:09 +010019void normal_prefix_increment(std::vector<int> &V) {
20 auto i = V.cbegin();
21 ++i; // no-warning
Adam Balogh2cfbe932018-08-28 08:41:15 +000022}
23
Adam Balogh23022b92019-11-08 12:52:09 +010024void invalidated_prefix_increment(std::vector<int> &V) {
25 auto i = V.cbegin();
26 V.erase(i);
27 ++i; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2cfbe932018-08-28 08:41:15 +000028}
Adam Balogh9a48ba62018-09-10 09:06:31 +000029
Adam Balogh23022b92019-11-08 12:52:09 +010030void normal_prefix_decrement(std::vector<int> &V) {
31 auto i = ++V.cbegin();
32 --i; // no-warning
Adam Balogh2e7cb342018-09-10 09:07:47 +000033}
34
Adam Balogh23022b92019-11-08 12:52:09 +010035void invalidated_prefix_decrement(std::vector<int> &V) {
36 auto i = ++V.cbegin();
37 V.erase(i);
38 --i; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2e7cb342018-09-10 09:07:47 +000039}
40
Adam Balogh23022b92019-11-08 12:52:09 +010041void normal_postfix_increment(std::vector<int> &V) {
42 auto i = V.cbegin();
43 i++; // no-warning
Adam Balogh2e7cb342018-09-10 09:07:47 +000044}
45
Adam Balogh23022b92019-11-08 12:52:09 +010046void invalidated_postfix_increment(std::vector<int> &V) {
47 auto i = V.cbegin();
48 V.erase(i);
49 i++; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2e7cb342018-09-10 09:07:47 +000050}
51
Adam Balogh23022b92019-11-08 12:52:09 +010052void normal_postfix_decrement(std::vector<int> &V) {
53 auto i = ++V.cbegin();
54 i--; // no-warning
Adam Balogh2e7cb342018-09-10 09:07:47 +000055}
56
Adam Balogh23022b92019-11-08 12:52:09 +010057void invalidated_postfix_decrement(std::vector<int> &V) {
58 auto i = ++V.cbegin();
59 V.erase(i);
60 i--; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2e7cb342018-09-10 09:07:47 +000061}
62
Adam Balogh23022b92019-11-08 12:52:09 +010063void normal_increment_by_2(std::vector<int> &V) {
64 auto i = V.cbegin();
65 i += 2; // no-warning
Adam Balogh12f5c7f2019-08-29 09:35:47 +000066}
67
Adam Balogh23022b92019-11-08 12:52:09 +010068void invalidated_increment_by_2(std::vector<int> &V) {
69 auto i = V.cbegin();
70 V.erase(i);
71 i += 2; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2e7cb342018-09-10 09:07:47 +000072}
73
Adam Balogh23022b92019-11-08 12:52:09 +010074void normal_increment_by_2_copy(std::vector<int> &V) {
75 auto i = V.cbegin();
76 auto j = i + 2; // no-warning
Adam Balogh12f5c7f2019-08-29 09:35:47 +000077}
78
Adam Balogh23022b92019-11-08 12:52:09 +010079void invalidated_increment_by_2_copy(std::vector<int> &V) {
80 auto i = V.cbegin();
81 V.erase(i);
82 auto j = i + 2; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh2e7cb342018-09-10 09:07:47 +000083}
84
Adam Balogh23022b92019-11-08 12:52:09 +010085void normal_decrement_by_2(std::vector<int> &V) {
86 auto i = V.cbegin();
87 i -= 2; // no-warning
Adam Balogh9a48ba62018-09-10 09:06:31 +000088}
89
Adam Balogh23022b92019-11-08 12:52:09 +010090void invalidated_decrement_by_2(std::vector<int> &V) {
91 auto i = V.cbegin();
92 V.erase(i);
93 i -= 2; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh9a48ba62018-09-10 09:06:31 +000094}
95
Adam Balogh23022b92019-11-08 12:52:09 +010096void normal_decrement_by_2_copy(std::vector<int> &V) {
97 auto i = V.cbegin();
98 auto j = i - 2; // no-warning
Adam Balogh9a48ba62018-09-10 09:06:31 +000099}
100
Adam Balogh23022b92019-11-08 12:52:09 +0100101void invalidated_decrement_by_2_copy(std::vector<int> &V) {
102 auto i = V.cbegin();
103 V.erase(i);
104 auto j = i - 2; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000105}
106
Adam Balogh23022b92019-11-08 12:52:09 +0100107void normal_subscript(std::vector<int> &V) {
108 auto i = V.cbegin();
109 i[1]; // no-warning
Adam Balogh9a48ba62018-09-10 09:06:31 +0000110}
111
Adam Balogh23022b92019-11-08 12:52:09 +0100112void invalidated_subscript(std::vector<int> &V) {
113 auto i = V.cbegin();
114 V.erase(i);
115 i[1]; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh9a48ba62018-09-10 09:06:31 +0000116}
117
Adam Balogh23022b92019-11-08 12:52:09 +0100118void assignment(std::vector<int> &V) {
119 auto i = V.cbegin();
120 V.erase(i);
121 auto j = V.cbegin(); // no-warning
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000122}
123