1// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core -analyzer-checker=deadcode.DeadStores,osx.cocoa.RetainCount -fblocks -verify -Wno-objc-root-class %s 2 3typedef signed char BOOL; 4typedef unsigned int NSUInteger; 5typedef 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 11extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); 12@interface NSValue : NSObject <NSCopying, NSCoding> - (void)getValue:(void *)value; @end 13typedef float CGFloat; 14typedef 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 25extern 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.llvm.org/pipermail/cfe-dev/2008-July/002157.html 31void 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. 41void 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. 48BOOL baz_rdar8527823(); 49void 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]); 75 // expected-warning@-1 {{Although the value stored to 'self'}} 76 return x; 77} 78@end 79 80// Don't flag dead stores when a variable is captured in a block used 81// by a property access. 82@interface RDar10591355 83@property (assign) int x; 84@end 85 86RDar10591355 *rdar10591355_aux(); 87 88void rdar10591355() { 89 RDar10591355 *p = rdar10591355_aux(); 90 ^{ (void) p.x; }(); 91} 92 93@interface Radar11059352_1 { 94@private 95 int *_pathString; 96} 97@property int *pathString; 98@end 99@interface Radar11059352 { 100@private 101Radar11059352_1 *_Path; 102} 103@end 104@implementation Radar11059352 105 106- (int*)usePath { 107 Radar11059352_1 *xxxxx = _Path; // no warning 108 int *wp = xxxxx.pathString; 109 return wp; 110} 111@end 112 113id test_objc_precise_lifetime_foo(); 114void test_objc_precise_lifetime() { 115 __attribute__((objc_precise_lifetime)) id dead = test_objc_precise_lifetime_foo(); // no-warning 116 dead = 0; 117 dead = test_objc_precise_lifetime_foo(); // no-warning 118 dead = 0; 119} 120