diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-01-25 23:54:44 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-01-25 23:54:44 +0000 |
commit | eaf969bf4b657f0c4577f38a39f8c4ef1d9272fc (patch) | |
tree | 6a3e6cd08ebca84ef4deedba9e9fe75d9f266192 /lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp | |
parent | 4d4feead7e240bf24264658b5abb0b88d52ed684 (diff) |
[analyzer] Do the self-init check only on NSObject subclasses. Patch by Jean-Daniel Dupas!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124249 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp b/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp index c887ac86ef..b62d2309fc 100644 --- a/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp +++ b/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; } |