xref: /openbsd-src/gnu/llvm/clang/lib/Analysis/plugins/CheckerOptionHandling/CheckerOptionHandling.cpp (revision ec727ea710c91afd8ce4f788c5aaa8482b7b69b2)
1e5dd7070Spatrick #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
2e5dd7070Spatrick #include "clang/StaticAnalyzer/Core/Checker.h"
3e5dd7070Spatrick #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
4e5dd7070Spatrick #include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h"
5e5dd7070Spatrick 
6e5dd7070Spatrick using namespace clang;
7e5dd7070Spatrick using namespace ento;
8e5dd7070Spatrick 
9e5dd7070Spatrick namespace {
10e5dd7070Spatrick struct MyChecker : public Checker<check::BeginFunction> {
checkBeginFunction__anon441515ca0111::MyChecker11e5dd7070Spatrick   void checkBeginFunction(CheckerContext &Ctx) const {}
12e5dd7070Spatrick };
13e5dd7070Spatrick 
registerMyChecker(CheckerManager & Mgr)14e5dd7070Spatrick void registerMyChecker(CheckerManager &Mgr) {
15e5dd7070Spatrick   MyChecker *Checker = Mgr.registerChecker<MyChecker>();
16e5dd7070Spatrick   llvm::outs() << "Example option is set to "
17e5dd7070Spatrick                << (Mgr.getAnalyzerOptions().getCheckerBooleanOption(
18e5dd7070Spatrick                        Checker, "ExampleOption")
19e5dd7070Spatrick                        ? "true"
20e5dd7070Spatrick                        : "false")
21e5dd7070Spatrick                << '\n';
22e5dd7070Spatrick }
23e5dd7070Spatrick 
shouldRegisterMyChecker(const CheckerManager & mgr)24*ec727ea7Spatrick bool shouldRegisterMyChecker(const CheckerManager &mgr) { return true; }
25e5dd7070Spatrick 
26e5dd7070Spatrick } // end anonymous namespace
27e5dd7070Spatrick 
28e5dd7070Spatrick // Register plugin!
clang_registerCheckers(CheckerRegistry & registry)29e5dd7070Spatrick extern "C" void clang_registerCheckers(CheckerRegistry &registry) {
30e5dd7070Spatrick   registry.addChecker(registerMyChecker, shouldRegisterMyChecker,
31e5dd7070Spatrick                       "example.MyChecker", "Example Description",
32e5dd7070Spatrick                       "example.mychecker.documentation.nonexistent.html",
33e5dd7070Spatrick                       /*isHidden*/false);
34e5dd7070Spatrick 
35e5dd7070Spatrick   registry.addCheckerOption(/*OptionType*/ "bool",
36e5dd7070Spatrick                             /*CheckerFullName*/ "example.MyChecker",
37e5dd7070Spatrick                             /*OptionName*/ "ExampleOption",
38e5dd7070Spatrick                             /*DefaultValStr*/ "false",
39e5dd7070Spatrick                             /*Description*/ "This is an example checker opt.",
40e5dd7070Spatrick                             /*DevelopmentStage*/ "released");
41e5dd7070Spatrick }
42e5dd7070Spatrick 
43e5dd7070Spatrick extern "C" const char clang_analyzerAPIVersionString[] =
44e5dd7070Spatrick     CLANG_ANALYZER_API_VERSION_STRING;
45