Custom Clang Stati c Анализатор шашки в Clang-8 - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь написать собственный анализатор в Clang, используя приведенный ниже пример:

https://clang-analyzer.llvm.org/checker_dev_manual.html

в приведенном выше учебнике, он указывает добавить следующий в checkers.td:

let ParentPackage = UnixAlpha in {
...
def SimpleFunc : Checker<"SimpleFunc">,
  HelpText<"Check for misuses of stream APIs">,
  DescFile<"SimpleFunc.cpp">;
...
} // end "alpha.unix"

Я сделал это, и я попытался построить Clang снова, но, к сожалению, он возвращает ошибку как "Class not found DescFile"

Так что я смотрю где-то внутри себя в checkers.td ни один из других контролеров не указал DescFile, у них есть то, что называется Документация (возможно, проблема с версией?)

, поэтому я изменил ее на Документацию со значением HasAlphaDocumentation и попытался построить заново, но теперь он не может создать и возвращает неопределенную ссылку на clang :: ento :: registerSimpleFun c (CheckerManager &)

ниже, как выглядит мой файл SimpleFun c. cpp:

#include "ClangSACheckers.h"
#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
#include "clang/StaticAnalyzer/Core/Checker.h"
#include "clang/StaticAnalyzer/Core/CheckerManager.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"

using namespace clang ;
using namespace ento ;

namespace {
class SimpleFunc : public Checker < check :: PreCall > {
mutable std :: unique_ptr < BugType > BT ;

public :
void checkPreCall ( const CallEvent & Call , CheckerContext & C ) const ;
};
}

void SimpleFunc :: checkPreCall ( const CallEvent & Call ,
 CheckerContext & C ) const {
if ( const IdentifierInfo * II = Call . getCalleeIdentifier ())
if ( II - > isStr (" main ")) {
if (! BT )
BT . reset (new BugType (this , " Call to main ", " Example checker " ));
ExplodedNode *N = C . generateErrorNode ();
auto Report = llvm :: make_unique < BugReport >(* BT , BT - > getName () , N );
    C.emitReport ( std :: move ( Report ));
 }
 }
void ento :: registerSimpleFunc (CheckerManager & Mgr ) {
    Mgr.registerChecker<SimpleFunc>();
 }
...