| // RUN: %check_clang_tidy %s cppcoreguidelines-owning-memory %t |
| |
| namespace gsl { |
| template <typename T> |
| using owner = T; |
| } |
| |
| namespace std { |
| |
| // Not actually a vector, but more a dynamic, fixed size array. Just to demonstrate |
| // functionality or the lack of the same. |
| template <typename T> |
| class vector { |
| public: |
| vector(unsigned long size, T val) : data{new T[size]}, size{size} { |
| for (unsigned long i = 0ul; i < size; ++i) { |
| data[i] = val; |
| } |
| } |
| |
| T *begin() { return data; } |
| T *end() { return &data[size]; } |
| T &operator[](unsigned long index) { return data[index]; } |
| |
| private: |
| T *data; |
| unsigned long size; |
| }; |
| |
| } // namespace std |
| |
| // All of the following codesnippets should be valid with appropriate 'owner<>' anaylsis, |
| // but currently the type information of 'gsl::owner<>' gets lost in typededuction. |
| int main() { |
| std::vector<gsl::owner<int *>> OwnerStdVector(100, nullptr); |
| |
| // Rangebased looping in resource vector. |
| for (auto *Element : OwnerStdVector) { |
| Element = new int(42); |
| // CHECK-MESSAGES: [[@LINE-1]]:5: warning: assigning newly created 'gsl::owner<>' to non-owner 'int *' |
| } |
| for (auto *Element : OwnerStdVector) { |
| delete Element; |
| // CHECK-MESSAGES: [[@LINE-1]]:5: warning: deleting a pointer through a type that is not marked 'gsl::owner<>'; consider using a smart pointer instead |
| // CHECK-MESSAGES: [[@LINE-3]]:8: note: variable declared here |
| } |
| |
| // Indexbased looping in resource vector. |
| for (int i = 0; i < 100; ++i) { |
| OwnerStdVector[i] = new int(42); |
| // CHECK-MESSAGES: [[@LINE-1]]:5: warning: assigning newly created 'gsl::owner<>' to non-owner 'int *' |
| } |
| for (int i = 0; i < 100; ++i) { |
| delete OwnerStdVector[i]; |
| // CHECK-MESSAGES: [[@LINE-1]]:5: warning: deleting a pointer through a type that is not marked 'gsl::owner<>'; consider using a smart pointer instead |
| // A note gets emitted here pointing to the return value of the operator[] from the |
| // vector implementation. Maybe this is considered misleading. |
| } |
| |
| return 0; |
| } |