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 | 3ae681eb1240f09af37936663760526ed1b324cf (patch) | |
tree | e7c582ef17b23321cf8bbaef5efced4e2b0a2751 /clang/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp | |
parent | d5cd645c74222f42054f67b0dd5426ff4a107803 (diff) | |
download | bcm5719-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.cpp | 16 |
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; } |