C++ 注册叮当声检查器时出错:“quot;“寄存器”的定义不一致;
我正在尝试将我自己的检查器添加到。在这之后,我做了以下工作: 在C++ 注册叮当声检查器时出错:“quot;“寄存器”的定义不一致;,c++,clang,clang-static-analyzer,C++,Clang,Clang Static Analyzer,我正在尝试将我自己的检查器添加到。在这之后,我做了以下工作: 在MyChecker.cpp中编写了骨架检查器: using namespace clang; using namespace ento; namespace { class MyChecker : public Checker<check::PreCall, check::PostCall,
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>();
}
并在Checkers.td中添加了一个条目:
def MyChecker : Checker<"MyChecker">,
HelpText<"MyChecker">,
DescFile<"MyChecker.cpp">;
为什么我不能注册MyChecker?所以clang静态checker注册依赖于包含静态checker注册函数生成声明的文件-。静态检查器源文件应该包括该头文件,并实现注册函数
void ento::registerMyChecker(checkermanger&mgr)
,那么registerMyChecker
声明在哪里?(假设代码部分来自MyChecker.cpp)它只在void ento::registerMyChecker(checker&mgr)一行中提到
-但这是定义,而不是声明,这正是编译器的抱怨。我正在按照说明添加检查器。我不知道声明在哪里。该教程似乎缺少大约80%的说明…然后您需要将ClangSACheckers.h
包含到文件中,以便声明可见。
def MyChecker : Checker<"MyChecker">,
HelpText<"MyChecker">,
DescFile<"MyChecker.cpp">;
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.