NSContainers.m revision 4b94f4daa13118441b4cf53b7e57cae1b48dc427
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.NilArg -verify -Wno-objc-root-class %s 2typedef unsigned long NSUInteger; 3typedef signed char BOOL; 4typedef struct _NSZone NSZone; 5@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; 6@protocol NSObject 7@end 8@protocol NSCopying 9- (id)copyWithZone:(NSZone *)zone; 10@end 11@protocol NSMutableCopying 12- (id)mutableCopyWithZone:(NSZone *)zone; 13@end 14@protocol NSCoding 15- (void)encodeWithCoder:(NSCoder *)aCoder; 16@end 17@protocol NSFastEnumeration 18@end 19@protocol NSSecureCoding <NSCoding> 20@required 21+ (BOOL)supportsSecureCoding; 22@end 23@interface NSObject <NSObject> {} 24- (id)init; 25+ (id)alloc; 26@end 27 28@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration> 29 30- (NSUInteger)count; 31- (id)objectAtIndex:(NSUInteger)index; 32 33@end 34 35@interface NSArray (NSExtendedArray) 36- (NSArray *)arrayByAddingObject:(id)anObject; 37- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx __attribute__((availability(macosx,introduced=10.8))); 38@end 39 40@interface NSMutableArray : NSArray 41 42- (void)addObject:(id)anObject; 43- (void)insertObject:(id)anObject atIndex:(NSUInteger)index; 44- (void)removeLastObject; 45- (void)removeObjectAtIndex:(NSUInteger)index; 46- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject; 47 48@end 49 50// NSMutableArray API 51void testNilArg1() { 52 NSMutableArray *marray = [[NSMutableArray alloc] init]; 53 [marray addObject:0]; // expected-warning {{Argument to 'NSMutableArray' method 'addObject:' cannot be nil}} 54} 55 56void testNilArg2() { 57 NSMutableArray *marray = [[NSMutableArray alloc] init]; 58 [marray insertObject:0 atIndex:1]; // expected-warning {{Argument to 'NSMutableArray' method 'insertObject:atIndex:' cannot be nil}} 59} 60 61void testNilArg3() { 62 NSMutableArray *marray = [[NSMutableArray alloc] init]; 63 [marray replaceObjectAtIndex:1 withObject:0]; // expected-warning {{Argument to 'NSMutableArray' method 'replaceObjectAtIndex:withObject:' cannot be nil}} 64} 65 66void testNilArg4() { 67 NSMutableArray *marray = [[NSMutableArray alloc] init]; 68 [marray setObject:0 atIndexedSubscript:1]; // expected-warning {{Argument to 'NSMutableArray' method 'setObject:atIndexedSubscript:' cannot be nil}} 69} 70 71// NSArray API 72void testNilArg5() { 73 NSArray *array = [[NSArray alloc] init]; 74 NSArray *copyArray = [array arrayByAddingObject:0]; // expected-warning {{Argument to 'NSArray' method 'arrayByAddingObject:' cannot be nil}} 75} 76 77