Files
llvm-project/clang-tools-extra/test/clang-tidy/cppcoreguidelines-owning-memory-containers.cpp
Jonas Toth c9aea86e6a [clang-tidy] introduce legacy resource functions to 'cppcoreguidelines-owning-memory'
Summary:
This patch introduces support for legacy C-style resource functions that must obey
the 'owner<>' semantics.

- added legacy creators like malloc,fopen,...
- added legacy consumers like free,fclose,...

This helps codes that mostly benefit from owner:
Legacy, C-Style code that isn't feasable to port directly to RAII but needs a step in between
to identify actual resource management and just using the resources.

Reviewers: aaron.ballman, alexfh, hokein

Reviewed By: aaron.ballman

Subscribers: nemanjai, JDevlieghere, xazax.hun, kbarton

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

llvm-svn: 316092
2017-10-18 16:14:15 +00:00

62 lines
2.0 KiB
C++

// 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;
}