r178387 - [analyzer] Tests for intersections with other checkers from MallocChecker.cpp factored out to NewDelete-intersections.mm
Anton Yartsev
anton.yartsev at gmail.com
Fri Mar 29 17:43:02 PDT 2013
Author: ayartsev
Date: Fri Mar 29 19:43:02 2013
New Revision: 178387
URL: http://llvm.org/viewvc/llvm-project?rev=178387&view=rev
Log:
[analyzer] Tests for intersections with other checkers from MallocChecker.cpp factored out to NewDelete-intersections.mm
Added:
cfe/trunk/test/Analysis/NewDelete-checker-test.cpp (props changed)
- copied unchanged from r178386, cfe/trunk/test/Analysis/NewDelete-checker-test.mm
Removed:
cfe/trunk/test/Analysis/NewDelete-checker-test.mm
Propchange: cfe/trunk/test/Analysis/NewDelete-checker-test.cpp
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Fri Mar 29 19:43:02 2013
@@ -0,0 +1,3 @@
+/cfe/branches/type-system-rewrite/test/Analysis/NewDelete-checker-test.mm:134693-134817
+/cfe/trunk/test/SemaTemplate/test/Analysis/NewDelete-checker-test.mm:126920
+/cfe/trunk/test/test/Analysis/NewDelete-checker-test.mm:170344
Removed: cfe/trunk/test/Analysis/NewDelete-checker-test.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/NewDelete-checker-test.mm?rev=178386&view=auto
==============================================================================
--- cfe/trunk/test/Analysis/NewDelete-checker-test.mm (original)
+++ cfe/trunk/test/Analysis/NewDelete-checker-test.mm (removed)
@@ -1,200 +0,0 @@
-// 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 leaks
-//------------------
-
-//----- Standard non-placement operators
-void testGlobalOpNew() {
- void *p = operator new(0);
-} // expected-warning{{Memory is never released; potential leak}}
-
-void testGlobalOpNewArray() {
- void *p = operator new[](0);
-} // expected-warning{{Memory is never released; potential leak}}
-
-void testGlobalNewExpr() {
- int *p = new int;
-} // expected-warning{{Memory is never released; potential leak}}
-
-void testGlobalNewExprArray() {
- int *p = new int[0];
-} // expected-warning{{Memory is never released; potential leak}}
-
-//----- Standard nothrow placement operators
-void testGlobalNoThrowPlacementOpNewBeforeOverload() {
- void *p = operator new(0, std::nothrow);
-} // expected-warning{{Memory is never released; potential leak}}
-
-void testGlobalNoThrowPlacementExprNewBeforeOverload() {
- int *p = new(std::nothrow) int;
-} // expected-warning{{Memory is never released; potential leak}}
-
-
-//----- Standard pointer placement operators
-void testGlobalPointerPlacementNew() {
- int i;
-
- void *p1 = operator new(0, &i); // no warn
-
- void *p2 = operator new[](0, &i); // no warn
-
- int *p3 = new(&i) int; // no warn
-
- int *p4 = new(&i) int[0]; // no warn
-}
-
-//----- Other cases
-void testNewMemoryIsInHeap() {
- int *p = new int;
- if (global != p) // condition is always true as 'p' wraps a heap region that
- // is different from a region wrapped by 'global'
- global = p; // pointer escapes
-}
-
-struct PtrWrapper {
- int *x;
-
- PtrWrapper(int *input) : x(input) {}
-};
-
-void testNewInvalidationPlacement(PtrWrapper *w) {
- // Ensure that we don't consider this a leak.
- new (w) PtrWrapper(new int); // no warn
-}
-
-//---------------
-// other checks
-//---------------
-
-void f(int *);
-
-void testUseAfterDelete() {
- int *p = new int;
- delete p;
- f(p); // expected-warning{{Use of memory after it is freed}}
-}
-
-void testDeleteAlloca() {
- int *p = (int *)__builtin_alloca(sizeof(int));
- delete p; // expected-warning{{Memory allocated by alloca() should not be deallocated}}
-}
-
-void testDoubleDelete() {
- int *p = new int;
- delete p;
- delete p; // expected-warning{{Attempt to free released memory}}
-}
-
-void testExprDeleteArg() {
- int i;
- delete &i; // expected-warning{{Argument to 'delete' is the address of the local variable 'i', which is not memory allocated by 'new'}}
-}
-
-void testExprDeleteArrArg() {
- int i;
- delete[] &i; // expected-warning{{Argument to 'delete[]' is the address of the local variable 'i', which is not memory allocated by 'new[]'}}
-}
-
-void testAllocDeallocNames() {
- int *p = new(std::nothrow) int[1];
- 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.
-//--------------------------------
-struct StWithConstPtr {
- const int *memp;
-};
-void escape(const int &x);
-void escapeStruct(const StWithConstPtr &x);
-void escapePtr(const StWithConstPtr *x);
-void escapeVoidPtr(const void *x);
-
-void testConstEscape() {
- int *p = new int(1);
- escape(*p);
-} // no-warning
-
-void testConstEscapeStruct() {
- StWithConstPtr *St = new StWithConstPtr();
- escapeStruct(*St);
-} // no-warning
-
-void testConstEscapeStructPtr() {
- StWithConstPtr *St = new StWithConstPtr();
- escapePtr(St);
-} // no-warning
-
-void testConstEscapeMember() {
- StWithConstPtr St;
- St.memp = new int(2);
- escapeVoidPtr(St.memp);
-} // no-warning
-
-void testConstEscapePlacementNew() {
- int *x = (int *)malloc(sizeof(int));
- void *y = new (x) int;
- escapeVoidPtr(y);
-} // no-warning
-
-
More information about the cfe-commits
mailing list