注册 Clang 检查器时出错:"out-of-line-definition of register"

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

本文关键字:out-of-line-definition of register 出错 Clang 检查 注册      更新时间:2023-10-16

我正在尝试将自己的检查器添加到 clang 的静态分析器中。按照向 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.

为什么我无法注册我的检查器?

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