Ошибка регистрации Clang Checker: "определение строки вне строки"

Я пытаюсь добавить свою собственную программу проверки в статический анализатор 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.

Почему я не могу зарегистрировать MyChecker?

1 ответ

Решение

Таким образом, регистрация статических контролеров clang основана на файле, содержащем сгенерированные объявления для функций регистрации статических контролеров - ClangSACheckers.h, Исходный файл статической проверки должен включать этот заголовочный файл и реализовывать функцию регистрации void ento::registerMyChecker(CheckerManager &mgr)

Другие вопросы по тегам