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