forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			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
 |