summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/NewDelete-intersections.mm
diff options
context:
space:
mode:
authorAnton Yartsev <anton.yartsev@gmail.com>2013-03-30 00:50:37 +0000
committerAnton Yartsev <anton.yartsev@gmail.com>2013-03-30 00:50:37 +0000
commit3dfc33e3aca1209ba7dfd8dde7bba3e73502962f (patch)
treefac87b3cb8d0c351d050fc64b706a0aaa94fde54 /clang/test/Analysis/NewDelete-intersections.mm
parentfa637577f999f94b3b591f22724100f596b4355e (diff)
downloadbcm5719-llvm-3dfc33e3aca1209ba7dfd8dde7bba3e73502962f.tar.gz
bcm5719-llvm-3dfc33e3aca1209ba7dfd8dde7bba3e73502962f.zip
[analyzer] Enabled unix.Malloc checker.
+ Refactoring. llvm-svn: 178388
Diffstat (limited to 'clang/test/Analysis/NewDelete-intersections.mm')
-rw-r--r--clang/test/Analysis/NewDelete-intersections.mm59
1 files changed, 59 insertions, 0 deletions
diff --git a/clang/test/Analysis/NewDelete-intersections.mm b/clang/test/Analysis/NewDelete-intersections.mm
new file mode 100644
index 00000000000..a61d31381be
--- /dev/null
+++ b/clang/test/Analysis/NewDelete-intersections.mm
@@ -0,0 +1,59 @@
+// 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"
+#include "Inputs/system-header-simulator-objc.h"
+
+typedef __typeof__(sizeof(int)) size_t;
+extern "C" void *malloc(size_t);
+extern "C" void free(void *);
+//int *global;
+
+//----------------------------------------------------------------------------
+// Check for intersections with unix.Malloc and unix.MallocWithAnnotations
+// checkers bounded with cplusplus.NewDelete.
+//----------------------------------------------------------------------------
+
+// malloc()/free() are subjects of unix.Malloc and unix.MallocWithAnnotations
+void testMallocFreeNoWarn() {
+ int i;
+ free(&i); // no warn
+
+ int *p1 = (int *)malloc(sizeof(int));
+ free(++p1); // no warn
+
+ int *p2 = (int *)malloc(sizeof(int));
+ free(p2);
+ free(p2); // no warn
+
+ int *p3 = (int *)malloc(sizeof(int)); // no warn
+}
+
+//----- Test free standard new
+void testFreeOpNew() {
+ void *p = operator new(0);
+ free(p);
+} // expected-warning{{Memory is never released; potential leak}}
+// FIXME: Pointer should escape
+
+void testFreeNewExpr() {
+ int *p = new int;
+ free(p);
+} // expected-warning{{Memory is never released; potential leak}}
+// FIXME: Pointer should escape
+
+void testObjcFreeNewed() {
+ int *p = new int;
+ NSData *nsdata = [NSData dataWithBytesNoCopy:p length:sizeof(int) freeWhenDone:1]; // expected-warning{{Memory is never released; potential leak}}
+}
+// FIXME: Pointer should escape
+
+void testFreeAfterDelete() {
+ int *p = new int;
+ delete p;
+ free(p); // expected-warning{{Use of memory after it is freed}}
+}
+
+void testStandardPlacementNewAfterDelete() {
+ int *p = new int;
+ delete p;
+ p = new(p) int; // expected-warning{{Use of memory after it is freed}}
+}
OpenPOWER on IntegriCloud