Home | History | Annotate | Download | only in Analysis
      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