mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-27 23:38:59 -04:00

Summary: This check aims to address a relatively common benign error where Objective-C subclass initializers call -self on their superclass instead of invoking a superclass initializer, typically -init. The error is typically benign because libobjc recognizes that improper initializer chaining is common¹. One theory for the frequency of this error might be that -init and -self have the same return type which could potentially cause inappropriate autocompletion to -self instead of -init. The equal selector lengths and triviality of common initializer code probably contribute to errors like this slipping through code review undetected. This check aims to flag errors of this form in the interests of correctness and reduce incidence of initialization failing to chain to -[NSObject init]. [1] "In practice, it will be hard to rely on this function. Many classes do not properly chain -init calls." From _objc_rootInit in https://opensource.apple.com/source/objc4/objc4-750.1/runtime/NSObject.mm.auto.html. Test Notes: Verified via `make check-clang-tools`. Subscribers: mgorny, xazax.hun, jdoerfert, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D59806 llvm-svn: 358620
53 lines
1.7 KiB
C++
53 lines
1.7 KiB
C++
//===--- ObjCTidyModule.cpp - clang-tidy --------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "../ClangTidy.h"
|
|
#include "../ClangTidyModule.h"
|
|
#include "../ClangTidyModuleRegistry.h"
|
|
#include "AvoidNSErrorInitCheck.h"
|
|
#include "AvoidSpinlockCheck.h"
|
|
#include "ForbiddenSubclassingCheck.h"
|
|
#include "PropertyDeclarationCheck.h"
|
|
#include "SuperSelfCheck.h"
|
|
|
|
using namespace clang::ast_matchers;
|
|
|
|
namespace clang {
|
|
namespace tidy {
|
|
namespace objc {
|
|
|
|
class ObjCModule : public ClangTidyModule {
|
|
public:
|
|
void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
|
|
CheckFactories.registerCheck<AvoidNSErrorInitCheck>(
|
|
"objc-avoid-nserror-init");
|
|
CheckFactories.registerCheck<AvoidSpinlockCheck>(
|
|
"objc-avoid-spinlock");
|
|
CheckFactories.registerCheck<ForbiddenSubclassingCheck>(
|
|
"objc-forbidden-subclassing");
|
|
CheckFactories.registerCheck<PropertyDeclarationCheck>(
|
|
"objc-property-declaration");
|
|
CheckFactories.registerCheck<SuperSelfCheck>(
|
|
"objc-super-self");
|
|
}
|
|
};
|
|
|
|
// Register the ObjCTidyModule using this statically initialized variable.
|
|
static ClangTidyModuleRegistry::Add<ObjCModule> X(
|
|
"objc-module",
|
|
"Adds Objective-C lint checks.");
|
|
|
|
} // namespace objc
|
|
|
|
// This anchor is used to force the linker to link in the generated object file
|
|
// and thus register the ObjCModule.
|
|
volatile int ObjCModuleAnchorSource = 0;
|
|
|
|
} // namespace tidy
|
|
} // namespace clang
|