dead-stores.m revision cdc3a89d5de90b2299c56f4a46c3de590c5184d1
1// RUN: %clang_cc1 -analyze -analyzer-checker=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.cs.uiuc.edu/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]); // 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
85RDar10591355 *rdar10591355_aux();
86
87void 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
100Radar11059352_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