diff options
| author | Ted Kremenek <kremenek@apple.com> | 2008-07-24 18:47:16 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2008-07-24 18:47:16 +0000 |
| commit | 9e9afb552cb68080649c9b1da62882e9a2016854 (patch) | |
| tree | 7d69f2c18d0e0180f4d798a831bdb6b68d6dd73b /clang | |
| parent | 365f21c8dbfeadb1e2e1ea9a8d5cd0548af9295e (diff) | |
| download | bcm5719-llvm-9e9afb552cb68080649c9b1da62882e9a2016854.tar.gz bcm5719-llvm-9e9afb552cb68080649c9b1da62882e9a2016854.zip | |
Correctly handle NSAssertionHandle -handleFailureInMethod:object:file:lineNumber:description:
This fixes: http://llvm.org/bugs/show_bug.cgi?id=2593
llvm-svn: 53993
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Analysis/CFRefCount.cpp | 1 | ||||
| -rw-r--r-- | clang/test/Analysis/CFRetainRelease_NSAssertionHandler.m | 64 |
2 files changed, 65 insertions, 0 deletions
diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp index edcddd22a55..17ad4481d30 100644 --- a/clang/lib/Analysis/CFRefCount.cpp +++ b/clang/lib/Analysis/CFRefCount.cpp @@ -1038,6 +1038,7 @@ void RetainSummaryManager::InitializeMethodSummaries() { II.clear(); II.push_back(&Ctx.Idents.get("handleFailureInMethod")); + II.push_back(&Ctx.Idents.get("object")); II.push_back(&Ctx.Idents.get("file")); II.push_back(&Ctx.Idents.get("lineNumber")); II.push_back(&Ctx.Idents.get("description")); diff --git a/clang/test/Analysis/CFRetainRelease_NSAssertionHandler.m b/clang/test/Analysis/CFRetainRelease_NSAssertionHandler.m new file mode 100644 index 00000000000..b17a51a673c --- /dev/null +++ b/clang/test/Analysis/CFRetainRelease_NSAssertionHandler.m @@ -0,0 +1,64 @@ +// RUN: clang -checker-cfref -verify %s + +typedef struct objc_selector *SEL; +typedef signed char BOOL; +typedef int NSInteger; +typedef unsigned int NSUInteger; +typedef struct _NSZone NSZone; +@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; +@protocol NSObject - (BOOL)isEqual:(id)object; @end +@protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end +@protocol NSMutableCopying - (id)mutableCopyWithZone:(NSZone *)zone; @end +@protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; @end +@interface NSObject <NSObject> {} - (id)init; @end +extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); +@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding> +- (NSUInteger)length; ++ (id)stringWithUTF8String:(const char *)nullTerminatedCString; +@end extern NSString * const NSBundleDidLoadNotification; +@interface NSAssertionHandler : NSObject {} ++ (NSAssertionHandler *)currentHandler; +- (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format,...; +@end +extern NSString * const NSConnectionReplyMode; + +//----------------------------------------------------------------------------// +// The following test case was filed in PR 2593: +// http://llvm.org/bugs/show_bug.cgi?id=2593 +// +// There should be no null dereference flagged by the checker because of +// NSParameterAssert and NSAssert. + + +@interface TestAssert : NSObject {} +@end + +@implementation TestAssert + +- (id)initWithPointer: (int*)x +{ + // Expansion of: NSParameterAssert( x != 0 ); + 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); + + if( (self = [super init]) != 0 ) + { + *x = 1; // no-warning + } + + return self; +} + +- (id)initWithPointer2: (int*)x +{ + // Expansion of: NSAssert( x != 0, @"" ); + 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); + + if( (self = [super init]) != 0 ) + { + *x = 1; // no-warning + } + + return self; +} + +@end |

