-// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete -analyzer-store region -std=c++11 -fblocks -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,unix.Malloc -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;
//------------------
delete[] (++p); // expected-warning{{Argument to 'delete[]' is offset by 4 bytes from the start of memory allocated by 'new[]'}}
}
-//----------------------------------------------------------------------------
-// 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}}
-}
-
//--------------------------------
// Test escape of newed const pointer. Note, a const pointer can be deleted.
//--------------------------------
void *y = new (x) int;
escapeVoidPtr(y);
} // no-warning
-
-
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete -analyzer-store region -std=c++11 -fblocks -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,unix.Malloc -analyzer-store region -std=c++11 -fblocks -verify %s
#include "Inputs/system-header-simulator-cxx.h"
void *allocator(std::size_t size);
} // expected-warning{{Memory is never released; potential leak}}
void testOpNewArray() {
- void *p = operator new[](0);
-} //FIXME: expected 'Memory is never released; potential leak'
+ void *p = operator new[](0); // call is inlined, no warn
+}
void testNewExprArray() {
int *p = new int[0];
//----- Custom non-placement operators
void testOpNew() {
- void *p = operator new(0);
-} //FIXME: expected 'Memory is never released; potential leak'
+ void *p = operator new(0); // call is inlined, no warn
+}
void testNewExpr() {
int *p = new int;
--- /dev/null
+// 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}}
+}
-// RUN: %clang_cc1 -analyze -analyzer-checker=cplusplus.NewDelete -analyzer-output=text -verify %s
-// RUN: %clang_cc1 -analyze -analyzer-checker=cplusplus.NewDelete -analyzer-output=plist %s -o %t.plist
+// RUN: %clang_cc1 -analyze -analyzer-checker=cplusplus.NewDelete,unix.Malloc -analyzer-output=text -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=cplusplus.NewDelete,unix.Malloc -analyzer-output=plist %s -o %t.plist
// RUN: FileCheck --input-file=%t.plist %s
void test() {
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete -analyzer-store region -std=c++11 -fblocks -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,cplusplus.NewDelete,unix.Malloc -analyzer-store region -std=c++11 -fblocks -verify %s
// expected-no-diagnostics
namespace std {