1 // RUN: %clang_cc1 -analyze -analyzer-checker=alpha.core -analyzer-checker=deadcode.DeadStores,osx.cocoa.RetainCount -fblocks -verify -Wno-objc-root-class %s 2 3 typedef signed char BOOL; 4 typedef unsigned int NSUInteger; 5 typedef struct _NSZone NSZone; 6 @class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; 7 @protocol NSObject - (BOOL)isEqual:(id)object; @end 8 @protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end 9 @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; @end 10 @interface NSObject <NSObject> {} @end 11 extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); 12 @interface NSValue : NSObject <NSCopying, NSCoding> - (void)getValue:(void *)value; @end 13 typedef float CGFloat; 14 typedef struct _NSPoint {} NSRange; 15 @interface NSValue (NSValueRangeExtensions) + (NSValue *)valueWithRange:(NSRange)range; 16 - (BOOL)containsObject:(id)anObject; 17 @end 18 @class NSURLAuthenticationChallenge; 19 @interface NSResponder : NSObject <NSCoding> {} @end 20 @class NSArray, NSDictionary, NSString; 21 @interface NSObject (NSKeyValueBindingCreation) 22 + (void)exposeBinding:(NSString *)binding; 23 - (NSArray *)exposedBindings; 24 @end 25 extern NSString *NSAlignmentBinding; 26 27 // This test case was reported as a false positive due to a bug in the 28 // LiveVariables <-> deadcode.DeadStores interplay. We should not flag a warning 29 // here. The test case was reported in: 30 // http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-July/002157.html 31 void DeadStoreTest(NSObject *anObject) { 32 NSArray *keys; 33 if ((keys = [anObject exposedBindings]) && // no-warning 34 ([keys containsObject:@"name"] && [keys containsObject:@"icon"])) {} 35 } 36 37 // This test case was a false positive due to how clang models 38 // pointer types and ObjC object pointer types differently. Here 39 // we don't warn about a dead store because 'nil' is assigned to 40 // an object pointer for the sake of defensive programming. 41 void rdar_7631278(NSObject *x) { 42 x = ((void*)0); 43 } 44 45 // This test case issuing a bogus warning for the declaration of 'isExec' 46 // because the compound statement for the @synchronized was being visited 47 // twice by the LiveVariables analysis. 48 BOOL baz_rdar8527823(); 49 void foo_rdar8527823(); 50 @interface RDar8527823 51 - (void) bar_rbar8527823; 52 @end 53 @implementation RDar8527823 54 - (void) bar_rbar8527823 55 { 56 @synchronized(self) { 57 BOOL isExec = baz_rdar8527823(); // no-warning 58 if (isExec) foo_rdar8527823(); 59 } 60 } 61 @end 62 63 // Don't flag dead stores to assignments to self within a nested assignment. 64 @interface Rdar7947686 65 - (id) init; 66 @end 67 68 @interface Rdar7947686_B : Rdar7947686 69 - (id) init; 70 @end 71 72 @implementation Rdar7947686_B 73 - (id) init { 74 id x = (self = [super init]); // no-warning 75 return x; 76 } 77 @end 78 79 // Don't flag dead stores when a variable is captured in a block used 80 // by a property access. 81 @interface RDar10591355 82 @property (assign) int x; 83 @end 84 85 RDar10591355 *rdar10591355_aux(); 86 87 void rdar10591355() { 88 RDar10591355 *p = rdar10591355_aux(); 89 ^{ (void) p.x; }(); 90 } 91 92 @interface Radar11059352_1 { 93 @private 94 int *_pathString; 95 } 96 @property int *pathString; 97 @end 98 @interface Radar11059352 { 99 @private 100 Radar11059352_1 *_Path; 101 } 102 @end 103 @implementation Radar11059352 104 105 - (int*)usePath { 106 Radar11059352_1 *xxxxx = _Path; // no warning 107 int *wp = xxxxx.pathString; 108 return wp; 109 } 110 @end 111