From a979712238d6285e79e8f1d6e8b813a1f640e88c Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Sat, 18 Feb 2012 21:37:48 +0000 Subject: [PATCH] Teach analyzer about NSAutoreleasePool -allocWithZone:. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150892 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp | 8 +++++--- test/Analysis/retain-release.m | 11 ++++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index 9ba83ce8dc..b6f91d9fdc 100644 --- a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -655,10 +655,11 @@ private: ObjCMethodSummaries[S] = Summ; } - void addClassMethSummary(const char* Cls, const char* nullaryName, - const RetainSummary *Summ) { + void addClassMethSummary(const char* Cls, const char* name, + const RetainSummary *Summ, bool isNullary = true) { IdentifierInfo* ClsII = &Ctx.Idents.get(Cls); - Selector S = GetNullarySelector(nullaryName, Ctx); + Selector S = isNullary ? GetNullarySelector(name, Ctx) + : GetUnarySelector(name, Ctx); ObjCClassMethodSummaries[ObjCSummaryKey(ClsII, S)] = Summ; } @@ -1508,6 +1509,7 @@ void RetainSummaryManager::InitializeMethodSummaries() { // Don't track allocated autorelease pools yet, as it is okay to prematurely // exit a method. addClassMethSummary("NSAutoreleasePool", "alloc", NoTrackYet); + addClassMethSummary("NSAutoreleasePool", "allocWithZone", NoTrackYet, false); // Create summaries QCRenderer/QCView -createSnapShotImageOfType: addInstMethSummary("QCRenderer", AllocSumm, diff --git a/test/Analysis/retain-release.m b/test/Analysis/retain-release.m index a6c24cee00..bb32635b4b 100644 --- a/test/Analysis/retain-release.m +++ b/test/Analysis/retain-release.m @@ -672,7 +672,7 @@ void rdar6704930(unsigned char *s, unsigned int length) { //===----------------------------------------------------------------------===// // clang checker fails to catch use-after-release //===----------------------------------------------------------------------===// - + int rdar_6257780_Case1() { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSArray *array = [NSArray array]; @@ -681,6 +681,15 @@ int rdar_6257780_Case1() { return 0; } +//===----------------------------------------------------------------------===// +// Analyzer is confused about NSAutoreleasePool -allocWithZone:. +//===----------------------------------------------------------------------===// + +void rdar_10640253_autorelease_allocWithZone() { + NSAutoreleasePool *pool = [[NSAutoreleasePool allocWithZone:(NSZone*)0] init]; + (void) pool; +} + //===----------------------------------------------------------------------===// // Checker should understand new/setObject:/release constructs //===----------------------------------------------------------------------===// -- 2.50.1