Ошибка регистрации Clang Checker: «определение строки вне строки» - PullRequest
0 голосов
/ 09 мая 2018

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

Добавлен исходный файл в файл Checkers 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 Ответ

0 голосов
/ 09 мая 2018

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

...