summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/NewDelete-custom.cpp
diff options
context:
space:
mode:
authorAnton Yartsev <anton.yartsev@gmail.com>2013-03-28 16:10:38 +0000
committerAnton Yartsev <anton.yartsev@gmail.com>2013-03-28 16:10:38 +0000
commit8b662704dc68e56e5df3763bb6816f0a07930fbb (patch)
tree84334c3b5b80d2efe7eb2d61fa5ab4f8498f8c6d /clang/test/Analysis/NewDelete-custom.cpp
parentc2aa348dd0ab28df2974f9c94c750277d04a5e8a (diff)
downloadbcm5719-llvm-8b662704dc68e56e5df3763bb6816f0a07930fbb.tar.gz
bcm5719-llvm-8b662704dc68e56e5df3763bb6816f0a07930fbb.zip
[analyzer] For now assume all standard global 'operator new' functions allocate memory in heap.
+ Improved test coverage for cplusplus.NewDelete checker. llvm-svn: 178244
Diffstat (limited to 'clang/test/Analysis/NewDelete-custom.cpp')
-rw-r--r--clang/test/Analysis/NewDelete-custom.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/clang/test/Analysis/NewDelete-custom.cpp b/clang/test/Analysis/NewDelete-custom.cpp
new file mode 100644
index 00000000000..47105ff4ef3
--- /dev/null
+++ b/clang/test/Analysis/NewDelete-custom.cpp
@@ -0,0 +1,57 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete -analyzer-store region -std=c++11 -fblocks -verify %s
+#include "Inputs/system-header-simulator-cxx.h"
+
+void *allocator(std::size_t size);
+
+void *operator new[](std::size_t size) throw() { return allocator(size); }
+void *operator new(std::size_t size) throw() { return allocator(size); }
+void *operator new(std::size_t size, std::nothrow_t& nothrow) throw() { return allocator(size); }
+void *operator new(std::size_t, double d);
+
+class C {
+public:
+ void *operator new(std::size_t);
+};
+
+void testNewMethod() {
+ void *p1 = C::operator new(0); // no warn
+
+ C *p2 = new C; // no warn
+
+ C *c3 = ::new C;
+} // expected-warning{{Memory is never released; potential leak}}
+
+void testOpNewArray() {
+ void *p = operator new[](0);
+} //FIXME: expected 'Memory is never released; potential leak'
+
+void testNewExprArray() {
+ int *p = new int[0];
+} // expected-warning{{Memory is never released; potential leak}}
+
+//----- Custom non-placement operators
+void testOpNew() {
+ void *p = operator new(0);
+} //FIXME: expected 'Memory is never released; potential leak'
+
+void testNewExpr() {
+ int *p = new int;
+} // expected-warning{{Memory is never released; potential leak}}
+
+//----- Custom NoThrow placement operators
+void testOpNewNoThrow() {
+ void *p = operator new(0, std::nothrow);
+} // expected-warning{{Memory is never released; potential leak}}
+
+void testNewExprNoThrow() {
+ int *p = new(std::nothrow) int;
+} // expected-warning{{Memory is never released; potential leak}}
+
+//----- Custom placement operators
+void testOpNewPlacement() {
+ void *p = operator new(0, 0.1); // no warn
+}
+
+void testNewExprPlacement() {
+ int *p = new(0.1) int; // no warn
+}
OpenPOWER on IntegriCloud