注册 Clang Checker 时出错:"out-of-line-definition of register"

Error registering Clang Checker: "out-of-line-definition of register"

我正在尝试将我自己的检查器添加到 clang's static analyzer. Following the instructions for adding a checker to clang,我已完成以下操作:

MyChecker.cpp 中编写了骨架检查器:

using namespace clang;
using namespace ento;

namespace {
    class MyChecker : public Checker<check::PreCall,
                                     check::PostCall,
                                     check::Location> {
    public:
      void checkPreCall(const CallEvent &Call, CheckerContext &C) const;
      void checkPostCall(const CallEvent &Call, CheckerContext &C) const;
    };

}

void MyChecker::checkPreCall(const CallEvent &Call, CheckerContext &C) const {}
void MyChecker::checkPostCall(const CallEvent &Call, CheckerContext &C) const {}

void ento::registerMyChecker(CheckerManager &mgr) {
  mgr.registerChecker<MyChecker>();
}

将源文件添加到跳棋 CMakeLists.txt 文件:

...
MPI-Checker/MPIFunctionClassifier.cpp
MyChecker.cpp
NSAutoreleasePoolChecker.cpp
...

并在 Checkers.td 中添加了一个条目:

def MyChecker : Checker<"MyChecker">,
  HelpText<"MyChecker">,
  DescFile<"MyChecker.cpp">;

当我尝试编译 clang 时出现以下错误:

MyChecker.cpp:30:12: error: out-of-line definition of 'registerMyChecker' does not match any declaration in namespace 'clang::ento'
void ento::registerMyChecker(CheckerManager &mgr) {
           ^~~~~~~~~~~~~~~~~
1 error generated.
ninja: build stopped: subcommand failed.

为什么我无法注册 MyChecker?

因此 clang 静态检查器注册依赖于包含为静态检查器注册函数生成的声明的文件 - ClangSACheckers.h。静态检查器源文件应包含该头文件并实现注册功能void ento::registerMyChecker(CheckerManager &mgr)