[cfe-commits] r124249 - in /cfe/trunk: lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp test/Analysis/self-init.m

Argyrios Kyrtzidis akyrtzi at gmail.com
Tue Jan 25 15:54:44 PST 2011


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
+ at interface NSProxy <NSObject> {}
+ at end
+
 //#import "Foundation/NSObject.h"
 typedef unsigned NSUInteger;
 typedef int NSInteger;
@@ -48,6 +51,10 @@
 -(void)doSomething;
 @end
 
+ at interface MyProxyObj : NSProxy {}
+-(id)init;
+ at end
+
 @implementation MyObj
 
 -(id)init {
@@ -137,3 +144,9 @@
 -(void)doSomething {}
 
 @end
+
+ at implementation MyProxyObj
+
+- (id)init { return self; }
+
+ at end





More information about the cfe-commits mailing list