200 lines
4.9 KiB
Objective-C
200 lines
4.9 KiB
Objective-C
// RUN: %clang_analyze_cc1 -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify %s
|
|
// RUN: %clang_analyze_cc1 -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify -triple x86_64-apple-darwin10 -fobjc-arc %s
|
|
|
|
#define NON_ARC !__has_feature(objc_arc)
|
|
|
|
// No diagnostics expected under ARC.
|
|
#if !NON_ARC
|
|
// expected-no-diagnostics
|
|
#endif
|
|
|
|
typedef signed char BOOL;
|
|
@protocol NSObject
|
|
- (BOOL)isEqual:(id)object;
|
|
- (Class)class;
|
|
@end
|
|
|
|
@interface NSObject <NSObject> {}
|
|
- (void)dealloc;
|
|
- (id)init;
|
|
@end
|
|
|
|
typedef struct objc_selector *SEL;
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Do not warn about missing -dealloc method. Not enough context to know
|
|
// whether the ivar is retained or not.
|
|
|
|
@interface MissingDeallocWithIvar : NSObject {
|
|
NSObject *_ivar;
|
|
}
|
|
@end
|
|
|
|
@implementation MissingDeallocWithIvar
|
|
@end
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Do not warn about missing -dealloc method. These properties are not
|
|
// retained or synthesized.
|
|
|
|
@interface MissingDeallocWithIntProperty : NSObject
|
|
@property (assign) int ivar;
|
|
@end
|
|
|
|
@implementation MissingDeallocWithIntProperty
|
|
@end
|
|
|
|
@interface MissingDeallocWithSELProperty : NSObject
|
|
@property (assign) SEL ivar;
|
|
@end
|
|
|
|
@implementation MissingDeallocWithSELProperty
|
|
@end
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Warn about missing -dealloc method.
|
|
|
|
@interface MissingDeallocWithCopyProperty : NSObject
|
|
@property (copy) NSObject *ivar;
|
|
@end
|
|
|
|
#if NON_ARC
|
|
// expected-warning@+2{{'MissingDeallocWithCopyProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
|
|
#endif
|
|
@implementation MissingDeallocWithCopyProperty
|
|
@end
|
|
|
|
@interface MissingDeallocWithRetainProperty : NSObject
|
|
@property (retain) NSObject *ivar;
|
|
@end
|
|
|
|
#if NON_ARC
|
|
// expected-warning@+2{{'MissingDeallocWithRetainProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
|
|
#endif
|
|
@implementation MissingDeallocWithRetainProperty
|
|
@end
|
|
|
|
@interface MissingDeallocWithMultipleProperties : NSObject
|
|
@property (retain) NSObject *ivar1;
|
|
@property (retain) NSObject *ivar2;
|
|
@end
|
|
|
|
#if NON_ARC
|
|
// expected-warning@+2{{'MissingDeallocWithMultipleProperties' lacks a 'dealloc' instance method but must release '_ivar1' and others}}
|
|
#endif
|
|
@implementation MissingDeallocWithMultipleProperties
|
|
@end
|
|
|
|
@interface MissingDeallocWithIVarAndRetainProperty : NSObject {
|
|
NSObject *_ivar2;
|
|
}
|
|
@property (retain) NSObject *ivar1;
|
|
@end
|
|
|
|
#if NON_ARC
|
|
// expected-warning@+2{{'MissingDeallocWithIVarAndRetainProperty' lacks a 'dealloc' instance method but must release '_ivar1'}}
|
|
#endif
|
|
@implementation MissingDeallocWithIVarAndRetainProperty
|
|
@end
|
|
|
|
@interface MissingDeallocWithReadOnlyRetainedProperty : NSObject
|
|
@property (readonly,retain) NSObject *ivar;
|
|
@end
|
|
|
|
#if NON_ARC
|
|
// expected-warning@+2{{'MissingDeallocWithReadOnlyRetainedProperty' lacks a 'dealloc' instance method but must release '_ivar'}}
|
|
#endif
|
|
@implementation MissingDeallocWithReadOnlyRetainedProperty
|
|
@end
|
|
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Don't warn about iVars that are selectors.
|
|
|
|
@interface TestSELs : NSObject {
|
|
SEL a;
|
|
SEL b;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation TestSELs
|
|
- (id)init {
|
|
if( (self = [super init]) ) {
|
|
a = @selector(a);
|
|
b = @selector(b);
|
|
}
|
|
|
|
return self;
|
|
}
|
|
@end
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Don't warn about iVars that are IBOutlets.
|
|
|
|
@class NSWindow;
|
|
|
|
@interface HasOutlet : NSObject {
|
|
IBOutlet NSWindow *window;
|
|
}
|
|
@end
|
|
|
|
@implementation HasOutlet // no-warning
|
|
@end
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// PR 3187: http://llvm.org/bugs/show_bug.cgi?id=3187
|
|
// - Disable the missing -dealloc check for classes that subclass SenTestCase
|
|
|
|
@class NSString;
|
|
|
|
@interface SenTestCase : NSObject {}
|
|
@end
|
|
|
|
@interface MyClassTest : SenTestCase {
|
|
NSString *resourcePath;
|
|
}
|
|
|
|
@property (retain) NSObject *ivar;
|
|
|
|
@end
|
|
|
|
@interface NSBundle : NSObject {}
|
|
+ (NSBundle *)bundleForClass:(Class)aClass;
|
|
- (NSString *)resourcePath;
|
|
@end
|
|
|
|
@implementation MyClassTest
|
|
- (void)setUp {
|
|
resourcePath = [[NSBundle bundleForClass:[self class]] resourcePath];
|
|
}
|
|
- (void)testXXX {
|
|
// do something which uses resourcepath
|
|
}
|
|
@end
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Don't warn for clases that aren't subclasses of NSObject
|
|
|
|
__attribute__((objc_root_class))
|
|
@interface NonNSObjectMissingDealloc
|
|
@property (retain) NSObject *ivar;
|
|
@end
|
|
@implementation NonNSObjectMissingDealloc
|
|
@end
|
|
|
|
|
|
//===------------------------------------------------------------------------===
|
|
// Don't crash on calls to dealloc as a class method.
|
|
|
|
@interface DeallocingClass : NSObject {}
|
|
@end
|
|
@implementation DeallocingClass
|
|
- (void)dealloc {
|
|
[DeallocingClass dealloc]; // FIXME: Should we warn on this specifically?
|
|
}
|
|
#if NON_ARC
|
|
// expected-warning@-2{{method possibly missing a [super dealloc] call}}
|
|
#endif
|
|
@end
|