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