diff options
| author | 2020-08-03 15:06:44 +0000 | |
|---|---|---|
| committer | 2020-08-03 15:06:44 +0000 | |
| commit | b64793999546ed8adebaeebd9d8345d18db8927d (patch) | |
| tree | 4357c27b561d73b0e089727c6ed659f2ceff5f47 /gnu/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CheckObjCInstMethSignature.cpp | |
| parent | Add support for UTF-8 DISPLAY-HINTs with octet length. For now only (diff) | |
| download | wireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.tar.xz wireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.zip | |
Remove LLVM 8.0.1 files.
Diffstat (limited to 'gnu/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CheckObjCInstMethSignature.cpp')
| -rw-r--r-- | gnu/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CheckObjCInstMethSignature.cpp | 140 |
1 files changed, 0 insertions, 140 deletions
diff --git a/gnu/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CheckObjCInstMethSignature.cpp b/gnu/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CheckObjCInstMethSignature.cpp deleted file mode 100644 index fe6715595e6..00000000000 --- a/gnu/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CheckObjCInstMethSignature.cpp +++ /dev/null @@ -1,140 +0,0 @@ -//=- CheckObjCInstMethodRetTy.cpp - Check ObjC method signatures -*- C++ -*-==// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines a CheckObjCInstMethSignature, a flow-insenstive check -// that determines if an Objective-C class interface incorrectly redefines -// the method signature in a subclass. -// -//===----------------------------------------------------------------------===// - -#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" -#include "clang/AST/ASTContext.h" -#include "clang/AST/DeclObjC.h" -#include "clang/AST/Type.h" -#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h" -#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h" -#include "clang/StaticAnalyzer/Core/Checker.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/Support/raw_ostream.h" - -using namespace clang; -using namespace ento; - -static bool AreTypesCompatible(QualType Derived, QualType Ancestor, - ASTContext &C) { - - // Right now don't compare the compatibility of pointers. That involves - // looking at subtyping relationships. FIXME: Future patch. - if (Derived->isAnyPointerType() && Ancestor->isAnyPointerType()) - return true; - - return C.typesAreCompatible(Derived, Ancestor); -} - -static void CompareReturnTypes(const ObjCMethodDecl *MethDerived, - const ObjCMethodDecl *MethAncestor, - BugReporter &BR, ASTContext &Ctx, - const ObjCImplementationDecl *ID, - const CheckerBase *Checker) { - - QualType ResDerived = MethDerived->getReturnType(); - QualType ResAncestor = MethAncestor->getReturnType(); - - if (!AreTypesCompatible(ResDerived, ResAncestor, Ctx)) { - std::string sbuf; - llvm::raw_string_ostream os(sbuf); - - os << "The Objective-C class '" - << *MethDerived->getClassInterface() - << "', which is derived from class '" - << *MethAncestor->getClassInterface() - << "', defines the instance method '"; - MethDerived->getSelector().print(os); - os << "' whose return type is '" - << ResDerived.getAsString() - << "'. A method with the same name (same selector) is also defined in " - "class '" - << *MethAncestor->getClassInterface() - << "' and has a return type of '" - << ResAncestor.getAsString() - << "'. These two types are incompatible, and may result in undefined " - "behavior for clients of these classes."; - - PathDiagnosticLocation MethDLoc = - PathDiagnosticLocation::createBegin(MethDerived, - BR.getSourceManager()); - - BR.EmitBasicReport( - MethDerived, Checker, "Incompatible instance method return type", - categories::CoreFoundationObjectiveC, os.str(), MethDLoc); - } -} - -static void CheckObjCInstMethSignature(const ObjCImplementationDecl *ID, - BugReporter &BR, - const CheckerBase *Checker) { - - const ObjCInterfaceDecl *D = ID->getClassInterface(); - const ObjCInterfaceDecl *C = D->getSuperClass(); - - if (!C) - return; - - ASTContext &Ctx = BR.getContext(); - - // Build a DenseMap of the methods for quick querying. - typedef llvm::DenseMap<Selector,ObjCMethodDecl*> MapTy; - MapTy IMeths; - unsigned NumMethods = 0; - - for (auto *M : ID->instance_methods()) { - IMeths[M->getSelector()] = M; - ++NumMethods; - } - - // Now recurse the class hierarchy chain looking for methods with the - // same signatures. - while (C && NumMethods) { - for (const auto *M : C->instance_methods()) { - Selector S = M->getSelector(); - - MapTy::iterator MI = IMeths.find(S); - - if (MI == IMeths.end() || MI->second == nullptr) - continue; - - --NumMethods; - ObjCMethodDecl *MethDerived = MI->second; - MI->second = nullptr; - - CompareReturnTypes(MethDerived, M, BR, Ctx, ID, Checker); - } - - C = C->getSuperClass(); - } -} - -//===----------------------------------------------------------------------===// -// ObjCMethSigsChecker -//===----------------------------------------------------------------------===// - -namespace { -class ObjCMethSigsChecker : public Checker< - check::ASTDecl<ObjCImplementationDecl> > { -public: - void checkASTDecl(const ObjCImplementationDecl *D, AnalysisManager& mgr, - BugReporter &BR) const { - CheckObjCInstMethSignature(D, BR, this); - } -}; -} - -void ento::registerObjCMethSigsChecker(CheckerManager &mgr) { - mgr.registerChecker<ObjCMethSigsChecker>(); -} |
