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 ®istry) {
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