Author: akirtzidis
Date: Tue Jan 25 17:54:44 2011
New Revision: 124249
URL: http://llvm.org/viewvc/llvm-project?rev=124249&view=rev
Log:
[analyzer] Do the self-init check only on NSObject subclasses. Patch by
Jean-Daniel Dupas!
Modified:
cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
cfe/trunk/test/Analysis/self-init.m
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp?rev=124249&r1=124248&r2=124249&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp Tue Jan 25
17:54:44 2011
@@ -270,11 +270,23 @@
const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(ND);
if (!MD)
return false;
- if (!MD->getClassInterface()->getSuperClass())
- return false;
if (!isInitializationMethod(MD))
return false;
+ // self = [super init] applies only to NSObject subclasses.
+ // For instance, NSProxy doesn't implement -init.
+ ASTContext& Ctx = MD->getASTContext();
+ IdentifierInfo* NSObjectII = &Ctx.Idents.get("NSObject");
+ ObjCInterfaceDecl* ID = MD->getClassInterface()->getSuperClass();
+ for ( ; ID ; ID = ID->getSuperClass()) {
+ IdentifierInfo *II = ID->getIdentifier();
+
+ if (II == NSObjectII)
+ break;
+ }
+ if (!ID)
+ return false;
+
return true;
}
Modified: cfe/trunk/test/Analysis/self-init.m
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/self-init.m?rev=124249&r1=124248&r2=124249&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/self-init.m (original)
+++ cfe/trunk/test/Analysis/self-init.m Tue Jan 25 17:54:44 2011
@@ -17,6 +17,9 @@
-(id)init;
-(id)release;
@end
+@interface NSProxy <NSObject> {}
+@end
+
//#import "Foundation/NSObject.h"
typedef unsigned NSUInteger;
typedef int NSInteger;
@@ -48,6 +51,10 @@
-(void)doSomething;
@end
+@interface MyProxyObj : NSProxy {}
+-(id)init;
+@end
+
@implementation MyObj
-(id)init {
@@ -137,3 +144,9 @@
-(void)doSomething {}
@end
+
+@implementation MyProxyObj
+
+- (id)init { return self; }
+
+@end
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits