retain/release checker: Treat NSObject method '-awakeAfterUsingCoder:'

just as if it behaved like an init function.  This fixes <rdar://problem/7129086>.

llvm-svn: 79515
This commit is contained in:
Ted Kremenek 2009-08-20 05:13:36 +00:00
parent 4d28366342
commit 815fbb6026
2 changed files with 35 additions and 10 deletions

View File

@ -635,8 +635,8 @@ class VISIBILITY_HIDDEN RetainSummaryManager {
/// objects.
RetEffect ObjCAllocRetE;
/// ObjCInitRetE - Default return effect for init methods returning Objective-C
/// objects.
/// ObjCInitRetE - Default return effect for init methods returning
/// Objective-C objects.
RetEffect ObjCInitRetE;
RetainSummary DefaultSummary;
@ -1452,8 +1452,13 @@ void RetainSummaryManager::InitializeMethodSummaries() {
// Create the "init" selector. It just acts as a pass-through for the
// receiver.
addNSObjectMethSummary(GetNullarySelector("init", Ctx),
getPersistentSummary(ObjCInitRetE, DecRefMsg));
RetainSummary *InitSumm = getPersistentSummary(ObjCInitRetE, DecRefMsg);
addNSObjectMethSummary(GetNullarySelector("init", Ctx), InitSumm);
// awakeAfterUsingCoder: behaves basically like an 'init' method. It
// claims the receiver and returns a retained object.
addNSObjectMethSummary(GetUnarySelector("awakeAfterUsingCoder", Ctx),
InitSumm);
// The next methods are allocators.
RetainSummary *AllocSumm = getPersistentSummary(ObjCAllocRetE);

View File

@ -94,19 +94,24 @@ typedef unsigned long NSUInteger;
extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2)));
typedef struct _NSZone NSZone;
@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
@protocol NSObject - (BOOL)isEqual:(id)object;
@protocol NSObject
- (BOOL)isEqual:(id)object;
- (id)retain;
- (oneway void)release;
- (id)autorelease;
@end @protocol NSCopying - (id)copyWithZone:(NSZone *)zone;
@end @protocol NSMutableCopying - (id)mutableCopyWithZone:(NSZone *)zone;
@end @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder;
@end @interface NSObject <NSObject> {
}
@end
@interface NSObject <NSObject> {}
+ (id)allocWithZone:(NSZone *)zone;
+ (id)alloc;
- (void)dealloc;
@end extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);
@end
@interface NSObject (NSCoderMethods)
- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder;
@end
extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);
typedef struct {
}
NSFastEnumerationState;
@ -647,7 +652,8 @@ typedef CFTypeRef OtherRef;
@end
//===----------------------------------------------------------------------===//
//<rdar://problem/6320065> false positive - init method returns an object owned by caller
//<rdar://problem/6320065> false positive - init method returns an object
// owned by caller
//===----------------------------------------------------------------------===//
@interface RDar6320065 : NSObject {
@ -690,7 +696,21 @@ int RDar6320065_test() {
}
//===----------------------------------------------------------------------===//
// <rdar://problem/6859457> [NSData dataWithBytesNoCopy] does not return a retained object
// <rdar://problem/7129086> -awakeAfterUsingCoder: returns an owned object
// and claims the receiver
//===----------------------------------------------------------------------===//
@interface RDar7129086 : NSObject {} @end
@implementation RDar7129086
- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder {
[self release]; // no-warning
return [NSString alloc]; // no-warning
}
@end
//===----------------------------------------------------------------------===//
// <rdar://problem/6859457> [NSData dataWithBytesNoCopy] does not return a
// retained object
//===----------------------------------------------------------------------===//
@interface RDar6859457 : NSObject {}