From ba67f6aa95733aaa9d79c82a8802e67b84e5d8e5 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Mon, 18 May 2009 23:14:34 +0000 Subject: [PATCH] Fix PR 4230: Don't flag leaks of NSAutoreleasePools until we know that we aren' at the top-most scope of autorelease pools. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72065 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/CFRefCount.cpp | 4 ++++ test/Analysis/retain-release.m | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index fbe9582516..d3f6ffbb60 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -1438,6 +1438,10 @@ void RetainSummaryManager::InitializeMethodSummaries() { addInstMethSummary("NSPanel", NoTrackYet, "initWithContentRect", "styleMask", "backing", "defer", "screen", NULL); #endif + + // Don't track allocated autorelease pools yet, as it is okay to prematurely + // exit a method. + addClassMethSummary("NSAutoreleasePool", "alloc", NoTrackYet); // Create NSAssertionHandler summaries. addPanicSummary("NSAssertionHandler", "handleFailureInFunction", "file", diff --git a/test/Analysis/retain-release.m b/test/Analysis/retain-release.m index 4a079055c5..b0855ca695 100644 --- a/test/Analysis/retain-release.m +++ b/test/Analysis/retain-release.m @@ -618,6 +618,18 @@ void test_RDar6859457(RDar6859457 *x, void *bytes, NSUInteger dataLength) { [NSData dataWithBytesNoCopy:bytes length:dataLength freeWhenDone:1]; // no-warning } +//===----------------------------------------------------------------------===// +// PR 4230 - an autorelease pool is not necessarily leaked during a premature +// return +//===----------------------------------------------------------------------===// + +static void PR4230(void) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // no-warning + NSString *object = [[[NSString alloc] init] autorelease]; // no-warning + return; +} + //===----------------------------------------------------------------------===// // Method name that has a null IdentifierInfo* for its first selector slot. // This test just makes sure that we handle it. -- 2.50.1