231 lines · cpp
1// 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 -verify2// 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 -verify3// RUN: %clang_analyze_cc1 -std=c++23 -analyzer-checker=core,cplusplus,alpha.cplusplus.InvalidatedIterator -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 %s -verify4 5#include "Inputs/system-header-simulator-cxx.h"6 7void clang_analyzer_warnIfReached();8 9void normal_dereference(std::vector<int> &V) {10 auto i = V.cbegin();11 *i; // no-warning12}13 14void invalidated_dereference(std::vector<int> &V) {15 auto i = V.cbegin();16 V.erase(i);17 *i; // expected-warning{{Invalidated iterator accessed}}18}19 20void normal_prefix_increment(std::vector<int> &V) {21 auto i = V.cbegin();22 ++i; // no-warning23}24 25void invalidated_prefix_increment(std::vector<int> &V) {26 auto i = V.cbegin();27 V.erase(i);28 ++i; // expected-warning{{Invalidated iterator accessed}}29}30 31void normal_prefix_decrement(std::vector<int> &V) {32 auto i = ++V.cbegin();33 --i; // no-warning34}35 36void invalidated_prefix_decrement(std::vector<int> &V) {37 auto i = ++V.cbegin();38 V.erase(i);39 --i; // expected-warning{{Invalidated iterator accessed}}40}41 42void normal_postfix_increment(std::vector<int> &V) {43 auto i = V.cbegin();44 i++; // no-warning45}46 47void invalidated_postfix_increment(std::vector<int> &V) {48 auto i = V.cbegin();49 V.erase(i);50 i++; // expected-warning{{Invalidated iterator accessed}}51}52 53void normal_postfix_decrement(std::vector<int> &V) {54 auto i = ++V.cbegin();55 i--; // no-warning56}57 58void invalidated_postfix_decrement(std::vector<int> &V) {59 auto i = ++V.cbegin();60 V.erase(i);61 i--; // expected-warning{{Invalidated iterator accessed}}62}63 64void normal_increment_by_2(std::vector<int> &V) {65 auto i = V.cbegin();66 i += 2; // no-warning67}68 69void invalidated_increment_by_2(std::vector<int> &V) {70 auto i = V.cbegin();71 V.erase(i);72 i += 2; // expected-warning{{Invalidated iterator accessed}}73}74 75void normal_increment_by_2_copy(std::vector<int> &V) {76 auto i = V.cbegin();77 auto j = i + 2; // no-warning78}79 80void invalidated_increment_by_2_copy(std::vector<int> &V) {81 auto i = V.cbegin();82 V.erase(i);83 auto j = i + 2; // expected-warning{{Invalidated iterator accessed}}84}85 86void normal_decrement_by_2(std::vector<int> &V) {87 auto i = V.cbegin();88 i -= 2; // no-warning89}90 91void invalidated_decrement_by_2(std::vector<int> &V) {92 auto i = V.cbegin();93 V.erase(i);94 i -= 2; // expected-warning{{Invalidated iterator accessed}}95}96 97void normal_decrement_by_2_copy(std::vector<int> &V) {98 auto i = V.cbegin();99 auto j = i - 2; // no-warning100}101 102void invalidated_decrement_by_2_copy(std::vector<int> &V) {103 auto i = V.cbegin();104 V.erase(i);105 auto j = i - 2; // expected-warning{{Invalidated iterator accessed}}106}107 108void normal_subscript(std::vector<int> &V) {109 auto i = V.cbegin();110 i[1]; // no-warning111}112 113void invalidated_subscript(std::vector<int> &V) {114 auto i = V.cbegin();115 V.erase(i);116 i[1]; // expected-warning{{Invalidated iterator accessed}}117}118 119void assignment(std::vector<int> &V) {120 auto i = V.cbegin();121 V.erase(i);122 auto j = V.cbegin(); // no-warning123}124 125template<typename T>126struct cont_with_ptr_iterator {127 T *begin() const;128 T *end() const;129 T &operator[](size_t);130 void push_back(const T&);131 T* erase(T*);132};133 134void invalidated_access_via_end_iterator_after_push_back() {135 cont_with_ptr_iterator<int> C;136 C.push_back(1);137 auto i = C.end();138 C.push_back(2);139 auto j = i[-1]; // expected-warning{{Invalidated iterator accessed}}140}141 142void invalidated_dereference_end_ptr_iterator(cont_with_ptr_iterator<int> &C) {143 auto i = C.begin();144 C.erase(i);145 (void) *i; // expected-warning{{Invalidated iterator accessed}}146}147 148void invalidated_prefix_increment_end_ptr_iterator(149 cont_with_ptr_iterator<int> &C) {150 auto i = C.begin();151 C.erase(i);152 ++i; // expected-warning{{Invalidated iterator accessed}}153}154 155void invalidated_prefix_decrement_end_ptr_iterator(156 cont_with_ptr_iterator<int> &C) {157 auto i = C.begin() + 1;158 C.erase(i);159 --i; // expected-warning{{Invalidated iterator accessed}}160}161 162void invalidated_postfix_increment_end_ptr_iterator(163 cont_with_ptr_iterator<int> &C) {164 auto i = C.begin();165 C.erase(i);166 i++; // expected-warning{{Invalidated iterator accessed}}167}168 169void invalidated_postfix_decrement_end_ptr_iterator(170 cont_with_ptr_iterator<int> &C) {171 auto i = C.begin() + 1;172 C.erase(i);173 i--; // expected-warning{{Invalidated iterator accessed}}174}175 176void invalidated_increment_by_2_end_ptr_iterator(177 cont_with_ptr_iterator<int> &C) {178 auto i = C.begin();179 C.erase(i);180 i += 2; // expected-warning{{Invalidated iterator accessed}}181}182 183void invalidated_increment_by_2_copy_end_ptr_iterator(184 cont_with_ptr_iterator<int> &C) {185 auto i = C.begin();186 C.erase(i);187 auto j = i + 2; // expected-warning{{Invalidated iterator accessed}}188}189 190void invalidated_decrement_by_2_end_ptr_iterator(191 cont_with_ptr_iterator<int> &C) {192 auto i = C.begin();193 C.erase(i);194 i -= 2; // expected-warning{{Invalidated iterator accessed}}195}196 197void invalidated_decrement_by_2_copy_end_ptr_iterator(198 cont_with_ptr_iterator<int> &C) {199 auto i = C.begin();200 C.erase(i);201 auto j = i - 2; // expected-warning{{Invalidated iterator accessed}}202}203 204void invalidated_subscript_end_ptr_iterator(cont_with_ptr_iterator<int> &C) {205 auto i = C.begin();206 C.erase(i);207 (void) i[1]; // expected-warning{{Invalidated iterator accessed}}208}209 210#if __cplusplus >= 202302L211namespace GH116372 {212 class ExplicitThis {213 int f = 0;214 public:215 ExplicitThis();216 ExplicitThis(ExplicitThis& other);217 218 ExplicitThis& operator=(this ExplicitThis& self, ExplicitThis const& other) { // no crash219 self.f = other.f;220 return self;221 }222 223 ~ExplicitThis();224 };225 226 void func(ExplicitThis& obj1) {227 obj1 = obj1;228 }229}230#endif231