1 | // RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.RetainCount,alpha.core -verify %s -analyzer-store=region |
2 | // expected-no-diagnostics |
3 | |
4 | typedef struct objc_selector *SEL; |
5 | typedef signed char BOOL; |
6 | typedef int NSInteger; |
7 | typedef unsigned int NSUInteger; |
8 | typedef struct _NSZone NSZone; |
9 | @class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; |
10 | @protocol NSObject - (BOOL)isEqual:(id)object; @end |
11 | @protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end |
12 | @protocol NSMutableCopying - (id)mutableCopyWithZone:(NSZone *)zone; @end |
13 | @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; @end |
14 | @interface NSObject <NSObject> {} - (id)init; @end |
15 | extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); |
16 | @interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding> |
17 | - (NSUInteger)length; |
18 | + (id)stringWithUTF8String:(const char *)nullTerminatedCString; |
19 | @end extern NSString * const NSBundleDidLoadNotification; |
20 | @interface NSAssertionHandler : NSObject {} |
21 | + (NSAssertionHandler *)currentHandler; |
22 | - (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format,...; |
23 | - (void)handleFailureInFunction:(NSString *)functionName file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format,...; |
24 | @end |
25 | extern NSString * const NSConnectionReplyMode; |
26 | |
27 | //----------------------------------------------------------------------------// |
28 | // The following test case was filed in PR 2593: |
29 | // http://llvm.org/bugs/show_bug.cgi?id=2593 |
30 | // |
31 | // There should be no null dereference flagged by the checker because of |
32 | // NSParameterAssert and NSAssert. |
33 | |
34 | |
35 | @interface TestAssert : NSObject {} |
36 | @end |
37 | |
38 | @implementation TestAssert |
39 | |
40 | - (id)initWithPointer: (int*)x |
41 | { |
42 | // Expansion of: NSParameterAssert( x != 0 ); |
43 | do { if (!((x != 0))) { [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd object:self file:[NSString stringWithUTF8String:"CFRetainRelease_NSAssertionHandler.m"] lineNumber:21 description:(@"Invalid parameter not satisfying: %s"), ("x != 0"), (0), (0), (0), (0)]; } } while(0); |
44 | |
45 | if( (self = [super init]) != 0 ) |
46 | { |
47 | *x = 1; // no-warning |
48 | } |
49 | |
50 | return self; |
51 | } |
52 | |
53 | - (id)initWithPointer2: (int*)x |
54 | { |
55 | // Expansion of: NSAssert( x != 0, @"" ); |
56 | do { if (!((x != 0))) { [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd object:self file:[NSString stringWithUTF8String:"CFRetainRelease_NSAssertionHandler.m"] lineNumber:33 description:((@"")), (0), (0), (0), (0), (0)]; } } while(0); |
57 | |
58 | if( (self = [super init]) != 0 ) |
59 | { |
60 | *x = 1; // no-warning |
61 | } |
62 | |
63 | return self; |
64 | } |
65 | |
66 | @end |
67 | |
68 | void pointerFunction (int *x) { |
69 | // Manual expansion of NSCAssert( x != 0, @"") |
70 | do { if (!((x != 0))) { [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] file:[NSString stringWithUTF8String:__FILE__] lineNumber:__LINE__ description:((@""))]; } } while(0); |
71 | |
72 | *x = 1; // no-warning |
73 | } |
74 | |