diff options
author | Anna Zaks <ganna@apple.com> | 2012-08-22 21:19:56 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2012-08-22 21:19:56 +0000 |
commit | 5a5a1755f2275b46a4e3c207b4241e0aff76efa7 (patch) | |
tree | 51c0a0bd9c05d47d124d051a3856106fd636493f /clang/test/Analysis/test-objc-non-nil-return-value-checker.m | |
parent | 26d3b2a272b80cd18d5c982b8c741662b1472ea7 (diff) | |
download | bcm5719-llvm-5a5a1755f2275b46a4e3c207b4241e0aff76efa7.tar.gz bcm5719-llvm-5a5a1755f2275b46a4e3c207b4241e0aff76efa7.zip |
[analyzer] Add osx.cocoa.NonNilReturnValue checker.
The checker adds assumptions that the return values from the known APIs
are non-nil. Teach the checker about NSArray/NSMutableArray/NSOrderedSet
objectAtIndex, objectAtIndexedSubscript.
llvm-svn: 162398
Diffstat (limited to 'clang/test/Analysis/test-objc-non-nil-return-value-checker.m')
-rw-r--r-- | clang/test/Analysis/test-objc-non-nil-return-value-checker.m | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/clang/test/Analysis/test-objc-non-nil-return-value-checker.m b/clang/test/Analysis/test-objc-non-nil-return-value-checker.m new file mode 100644 index 00000000000..8b1e6a5054a --- /dev/null +++ b/clang/test/Analysis/test-objc-non-nil-return-value-checker.m @@ -0,0 +1,50 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.NonNilReturnValue,debug.ExprInspection -verify %s + +typedef unsigned int NSUInteger; +typedef signed char BOOL; + +@protocol NSObject - (BOOL)isEqual:(id)object; @end + +@interface NSObject <NSObject> {} ++(id)alloc; ++(id)new; +-(id)init; +-(id)autorelease; +-(id)copy; +- (Class)class; +-(id)retain; +@end + +@interface NSArray : NSObject +- (id)objectAtIndex:(unsigned long)index; +@end + +@interface NSArray (NSExtendedArray) +- (id)objectAtIndexedSubscript:(NSUInteger)idx; +@end + +@interface NSMutableArray : NSArray +- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject; +@end + +@interface NSOrderedSet : NSObject +@end +@interface NSOrderedSet (NSOrderedSetCreation) +- (id)objectAtIndexedSubscript:(NSUInteger)idx; +@end + +void clang_analyzer_eval(id); + +void assumeThatNSArrayObjectAtIndexIsNeverNull(NSArray *A, NSUInteger i) { + clang_analyzer_eval([A objectAtIndex: i]); // expected-warning {{TRUE}} + id subscriptObj = A[1]; + clang_analyzer_eval(subscriptObj); // expected-warning {{TRUE}} +} + +void assumeThatNSMutableArrayObjectAtIndexIsNeverNull(NSMutableArray *A, NSUInteger i) { + clang_analyzer_eval([A objectAtIndex: i]); // expected-warning {{TRUE}} +} + +void assumeThatNSArrayObjectAtIndexedSubscriptIsNeverNull(NSOrderedSet *A, NSUInteger i) { + clang_analyzer_eval(A[i]); // expected-warning {{TRUE}} +}
\ No newline at end of file |