繁体   English   中英

如何注册我的 Clang Static 分析仪检查器

[英]How do I register my Clang Static Analyzer checker

我完全知道这个问题有以前的答案。 但是,这些答案是旧的,并没有反映当前代码库中发生的事情。

我已按照本指南中的步骤开发检查器、将其注册到引擎并进行测试。

经过一些工作后,我能够编译代码,但是在运行clang -cc1 -analyzer-checker-help时,我的检查器不可见。 我注意到很多跳棋是不可见的。

我是否需要在命令行上显式启用检查器? 如果不是,我错过了什么?

当我运行clang --analyze test.cpp of clang -cc1 -analyze test.cpp我的检查器没有发出警告。 但其他人会这样做,即使是clang -cc1 -analyzer-checker-help命令中“不可见”的那些。

请不要将我指向已过时的 6 年旧文档的方向。 我想知道如何完成这项工作。

我的代码:

MainCallChecker.cpp

using namespace clang;
using namespace ento;
namespace {
class MainCallChecker : public Checker<check::PreCall> {
  mutable std::unique_ptr<BugType> BT;

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

void MainCallChecker::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 R = std::make_unique<PathSensitiveBugReport>(*BT, BT->getCheckerName(), N);
        C.emitReport(std::move(R));
      }

    }

  }

}

void ento::registerMainCallChecker(CheckerManager &mgr){
  mgr.registerChecker<MainCallChecker>();
}

西洋跳棋

def MainCallChecker : Checker<"MainCall">,
  HelpText<"MyChecker">,
  Documentation<NotDocumented>;

CMakeLists.txt

add_clang_library(clangStaticAnalyzerCheckers
.
.
MainCallChecker.cpp
.
.
)

测试.cpp

typedef int (*main_t)(int, char **);
int main(int argc, char** argv) {
        main_t foo = main;
        int exit_code = foo(argc, argv);
        return exit_code;
        
}

更新:一位 Clang 的贡献者为我提供了一个有用的答案,解决了我的问题。 通过llvm discorse

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM