diff options
author | Anton Yartsev <anton.yartsev@gmail.com> | 2013-03-30 00:50:37 +0000 |
---|---|---|
committer | Anton Yartsev <anton.yartsev@gmail.com> | 2013-03-30 00:50:37 +0000 |
commit | 8e452e7d6ee00a7d12eb54b91498b59b6fefef4f (patch) | |
tree | b5abd714a0555208edef38ed48f9535d97e77332 | |
parent | 1f3b5d990e9afa0b2b8db0908f46d8de7818e642 (diff) |
[analyzer] Enabled unix.Malloc checker.
+ Refactoring.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178388 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/Analysis/NewDelete-checker-test.cpp | 57 | ||||
-rw-r--r-- | test/Analysis/NewDelete-custom.cpp | 10 | ||||
-rw-r--r-- | test/Analysis/NewDelete-intersections.mm | 59 | ||||
-rw-r--r-- | test/Analysis/NewDelete-path-notes.cpp | 4 | ||||
-rw-r--r-- | test/Analysis/NewDelete-variadic.cpp | 2 |
5 files changed, 68 insertions, 64 deletions
diff --git a/test/Analysis/NewDelete-checker-test.cpp b/test/Analysis/NewDelete-checker-test.cpp index 5311ff6fe7..2b01dfe537 100644 --- a/test/Analysis/NewDelete-checker-test.cpp +++ b/test/Analysis/NewDelete-checker-test.cpp @@ -1,10 +1,8 @@ -// 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; //------------------ @@ -108,57 +106,6 @@ void testAllocDeallocNames() { 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. //-------------------------------- @@ -196,5 +143,3 @@ void testConstEscapePlacementNew() { void *y = new (x) int; escapeVoidPtr(y); } // no-warning - - diff --git a/test/Analysis/NewDelete-custom.cpp b/test/Analysis/NewDelete-custom.cpp index 47105ff4ef..04dda2e7c3 100644 --- a/test/Analysis/NewDelete-custom.cpp +++ b/test/Analysis/NewDelete-custom.cpp @@ -1,4 +1,4 @@ -// 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); @@ -22,8 +22,8 @@ void testNewMethod() { } // 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]; @@ -31,8 +31,8 @@ void testNewExprArray() { //----- 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; diff --git a/test/Analysis/NewDelete-intersections.mm b/test/Analysis/NewDelete-intersections.mm new file mode 100644 index 0000000000..a61d31381b --- /dev/null +++ b/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}} +} diff --git a/test/Analysis/NewDelete-path-notes.cpp b/test/Analysis/NewDelete-path-notes.cpp index 296170a541..83e6e9f06a 100644 --- a/test/Analysis/NewDelete-path-notes.cpp +++ b/test/Analysis/NewDelete-path-notes.cpp @@ -1,5 +1,5 @@ -// 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() { diff --git a/test/Analysis/NewDelete-variadic.cpp b/test/Analysis/NewDelete-variadic.cpp index 4b02403c70..b74199b525 100644 --- a/test/Analysis/NewDelete-variadic.cpp +++ b/test/Analysis/NewDelete-variadic.cpp @@ -1,4 +1,4 @@ -// 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 { |