summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/test-objc-non-nil-return-value-checker.m
diff options
context:
space:
mode:
authorAnna Zaks <ganna@apple.com>2012-08-22 21:19:56 +0000
committerAnna Zaks <ganna@apple.com>2012-08-22 21:19:56 +0000
commit5a5a1755f2275b46a4e3c207b4241e0aff76efa7 (patch)
tree51c0a0bd9c05d47d124d051a3856106fd636493f /clang/test/Analysis/test-objc-non-nil-return-value-checker.m
parent26d3b2a272b80cd18d5c982b8c741662b1472ea7 (diff)
downloadbcm5719-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.m50
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
OpenPOWER on IntegriCloud