10b57cec5SDimitry Andric #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
20b57cec5SDimitry Andric #include "clang/StaticAnalyzer/Core/Checker.h"
30b57cec5SDimitry Andric #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
40b57cec5SDimitry Andric #include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h"
50b57cec5SDimitry Andric 
60b57cec5SDimitry Andric using namespace clang;
70b57cec5SDimitry Andric using namespace ento;
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric namespace {
100b57cec5SDimitry Andric struct MyChecker : public Checker<check::BeginFunction> {
checkBeginFunction__anon7c8e5c650111::MyChecker110b57cec5SDimitry Andric   void checkBeginFunction(CheckerContext &Ctx) const {}
120b57cec5SDimitry Andric };
130b57cec5SDimitry Andric 
registerMyChecker(CheckerManager & Mgr)140b57cec5SDimitry Andric void registerMyChecker(CheckerManager &Mgr) {
150b57cec5SDimitry Andric   MyChecker *Checker = Mgr.registerChecker<MyChecker>();
160b57cec5SDimitry Andric   llvm::outs() << "Example option is set to "
170b57cec5SDimitry Andric                << (Mgr.getAnalyzerOptions().getCheckerBooleanOption(
180b57cec5SDimitry Andric                        Checker, "ExampleOption")
190b57cec5SDimitry Andric                        ? "true"
200b57cec5SDimitry Andric                        : "false")
210b57cec5SDimitry Andric                << '\n';
220b57cec5SDimitry Andric }
230b57cec5SDimitry Andric 
shouldRegisterMyChecker(const CheckerManager & mgr)24*5ffd83dbSDimitry Andric bool shouldRegisterMyChecker(const CheckerManager &mgr) { return true; }
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric } // end anonymous namespace
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric // Register plugin!
clang_registerCheckers(CheckerRegistry & registry)290b57cec5SDimitry Andric extern "C" void clang_registerCheckers(CheckerRegistry &registry) {
300b57cec5SDimitry Andric   registry.addChecker(registerMyChecker, shouldRegisterMyChecker,
310b57cec5SDimitry Andric                       "example.MyChecker", "Example Description",
320b57cec5SDimitry Andric                       "example.mychecker.documentation.nonexistent.html",
330b57cec5SDimitry Andric                       /*isHidden*/false);
340b57cec5SDimitry Andric 
350b57cec5SDimitry Andric   registry.addCheckerOption(/*OptionType*/ "bool",
360b57cec5SDimitry Andric                             /*CheckerFullName*/ "example.MyChecker",
370b57cec5SDimitry Andric                             /*OptionName*/ "ExampleOption",
380b57cec5SDimitry Andric                             /*DefaultValStr*/ "false",
390b57cec5SDimitry Andric                             /*Description*/ "This is an example checker opt.",
400b57cec5SDimitry Andric                             /*DevelopmentStage*/ "released");
410b57cec5SDimitry Andric }
420b57cec5SDimitry Andric 
430b57cec5SDimitry Andric extern "C" const char clang_analyzerAPIVersionString[] =
440b57cec5SDimitry Andric     CLANG_ANALYZER_API_VERSION_STRING;
45