From 0b6b0e7157d35b565d2840c94a816c18c9036d0d Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Mon, 2 Jun 2008 17:14:13 +0000 Subject: [PATCH] Teach the CF retain checker about "_init" methods. Fixes: llvm-svn: 51872 --- clang/lib/Analysis/CFRefCount.cpp | 2 +- clang/test/Analysis-Apple/NSString.m | 29 +++++++++++++++++++--------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp index 5660929a8799..24971edcdde4 100644 --- a/clang/lib/Analysis/CFRefCount.cpp +++ b/clang/lib/Analysis/CFRefCount.cpp @@ -607,7 +607,7 @@ RetainSummaryManager::getMethodSummary(ObjCMessageExpr* ME) { const char* s = S.getIdentifierInfoForSlot(0)->getName(); assert (ScratchArgs.empty()); - if (strncmp(s, "init", 4) == 0) + if (strncmp(s, "init", 4) == 0 || strncmp(s, "_init", 5) == 0) return getInitMethodSummary(S); // "copyXXX", "createXXX", "newXXX": allocators. diff --git a/clang/test/Analysis-Apple/NSString.m b/clang/test/Analysis-Apple/NSString.m index bf9d4e8e8829..a1eefd45d73c 100644 --- a/clang/test/Analysis-Apple/NSString.m +++ b/clang/test/Analysis-Apple/NSString.m @@ -71,23 +71,15 @@ NSString* f10() { } @interface C1 : NSObject {} - - (NSString*) getShared; + (C1*) sharedInstance; - @end - @implementation C1 : NSObject {} - - (NSString*) getShared { - static NSString* s = nil; - - if (!s) s = [[NSString alloc] init]; - + if (!s) s = [[NSString alloc] init]; return s; // no-warning } - + (C1 *)sharedInstance { static C1 *sharedInstance = nil; if (!sharedInstance) { @@ -95,6 +87,25 @@ NSString* f10() { } return sharedInstance; // no-warning } +@end +@interface SharedClass : NSObject ++ (id)sharedInstance; @end +@implementation SharedClass +- (id)_init { + if ((self = [super init])) { + NSLog(@"Bar"); + } + return self; +} + ++ (id)sharedInstance { + static SharedClass *_sharedInstance = nil; + if (!_sharedInstance) { + _sharedInstance = [[SharedClass alloc] _init]; + } + return _sharedInstance; // no-warning +} +@end -- GitLab