blob: 0be8285c31a6bccf3c3e827185e56847afa61146 [file] [log] [blame]
Argyrios Kyrtzidisd7a31ba2011-01-11 19:45:25 +00001// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem %s -verify
2
3@class NSZone, NSCoder;
4@protocol NSObject
5@end
6@protocol NSCopying - (id)copyWithZone:(NSZone *)zone;
7@end
8@protocol NSMutableCopying - (id)mutableCopyWithZone:(NSZone *)zone;
9@end
10@protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder;
11@end
12@interface NSObject <NSObject> {}
13+ (id)allocWithZone:(NSZone *)zone;
14+ (id)alloc;
15- (void)dealloc;
16-(id)class;
17-(id)init;
18-(id)release;
19@end
Argyrios Kyrtzidiseaf969b2011-01-25 23:54:44 +000020@interface NSProxy <NSObject> {}
21@end
22
Argyrios Kyrtzidisd7a31ba2011-01-11 19:45:25 +000023//#import "Foundation/NSObject.h"
24typedef unsigned NSUInteger;
25typedef int NSInteger;
26
27@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
28@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>
29- (NSUInteger)length;
30+ (id)stringWithUTF8String:(const char *)nullTerminatedCString;
31@end extern NSString * const NSBundleDidLoadNotification;
32@interface NSAssertionHandler : NSObject {}
33+ (NSAssertionHandler *)currentHandler;
34- (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format,...;
35@end
36extern NSString * const NSConnectionReplyMode;
37
38@interface NSBundle : NSObject
39+(id)loadNibNamed:(NSString*)s owner:(id)o;
40@end
41
42void log(void *obj);
43extern void *somePtr;
44
45@interface MyObj : NSObject {
46 id myivar;
47 int myint;
48}
49-(id)_init;
50-(id)initWithSomething:(int)x;
51-(void)doSomething;
52@end
53
Argyrios Kyrtzidiseaf969b2011-01-25 23:54:44 +000054@interface MyProxyObj : NSProxy {}
55-(id)init;
56@end
57
Argyrios Kyrtzidisd7a31ba2011-01-11 19:45:25 +000058@implementation MyObj
59
60-(id)init {
61 do { if (!((somePtr != 0))) { [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd object:self file:[NSString stringWithUTF8String:"init.m"] lineNumber:21 description:(@"Invalid parameter not satisfying: %s"), ("x != 0"), (0), (0), (0), (0)]; } } while(0);
62 return [self initWithSomething:0];
63}
64
65-(id)init2 {
66 self = [self initWithSomething:0];
67 return self;
68}
69
70-(id)init3 {
71 log([self class]);
72 return [self initWithSomething:0];
73}
74
75-(id)init4 {
76 self = [super init];
77 if (self) {
78 log(&self);
79 }
80 return self;
81}
82
83- (id)initWithSomething:(int)x {
84 if ((self = [super init]))
85 myint = x;
86 return self;
87}
88
89-(id)_init {
90 myivar = 0;
91 return self;
92}
93
94-(id)init5 {
95 [NSBundle loadNibNamed:@"Window" owner:self];
96 return [self initWithSomething:0];
97}
98
99-(id)init6 {
Argyrios Kyrtzidis4717f162011-01-26 01:26:41 +0000100 [NSBundle loadNibNamed:@"Window" owner:myivar]; // expected-warning {{Instance variable used}}
Argyrios Kyrtzidisd7a31ba2011-01-11 19:45:25 +0000101 return [self initWithSomething:0];
102}
103
104-(id)init7 {
105 if (0 != (self = [self _init]))
106 myivar = 0;
107 return self;
108}
109
110-(id)init8 {
111 if ((self = [super init])) {
112 log(&self);
113 myivar = 0;
114 }
115 return self;
116}
117
118-(id)init9 {
119 [self doSomething];
120 return self; // expected-warning {{Returning 'self'}}
121}
122
123-(id)init10 {
Argyrios Kyrtzidis4717f162011-01-26 01:26:41 +0000124 myivar = 0; // expected-warning {{Instance variable used}}
Argyrios Kyrtzidisd7a31ba2011-01-11 19:45:25 +0000125 return self;
126}
127
128-(id)init11 {
129 return self; // expected-warning {{Returning 'self'}}
130}
131
132-(id)init12 {
133 [super init];
134 return self; // expected-warning {{Returning 'self'}}
135}
136
137-(id)init13 {
138 if ((self == [super init])) {
Argyrios Kyrtzidis4717f162011-01-26 01:26:41 +0000139 myivar = 0; // expected-warning {{Instance variable used}}
Argyrios Kyrtzidisd7a31ba2011-01-11 19:45:25 +0000140 }
141 return self; // expected-warning {{Returning 'self'}}
142}
143
144-(void)doSomething {}
145
146@end
Argyrios Kyrtzidiseaf969b2011-01-25 23:54:44 +0000147
148@implementation MyProxyObj
149
150- (id)init { return self; }
151
152@end