summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-01-25 23:54:44 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-01-25 23:54:44 +0000
commit3ae681eb1240f09af37936663760526ed1b324cf (patch)
treee7c582ef17b23321cf8bbaef5efced4e2b0a2751 /clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
parentd5cd645c74222f42054f67b0dd5426ff4a107803 (diff)
downloadbcm5719-llvm-3ae681eb1240f09af37936663760526ed1b324cf.tar.gz
bcm5719-llvm-3ae681eb1240f09af37936663760526ed1b324cf.zip
[analyzer] Do the self-init check only on NSObject subclasses. Patch by Jean-Daniel Dupas!
llvm-svn: 124249
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
index c887ac86ef5..b62d2309fce 100644
--- a/clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
@@ -270,11 +270,23 @@ static bool shouldRunOnFunctionOrMethod(const NamedDecl *ND) {
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;
}
OpenPOWER on IntegriCloud