| 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 | // This barebones plugin is used by clang/test/Analysis/checker-plugins.c |
| 9 | // to test option handling on checkers loaded from plugins. |
| 10 | |
| 11 | namespace { |
| 12 | struct MyChecker : public Checker<check::BeginFunction> { |
| 13 | void checkBeginFunction(CheckerContext &Ctx) const {} |
| 14 | }; |
| 15 | |
| 16 | void registerMyChecker(CheckerManager &Mgr) { |
| 17 | MyChecker *Checker = Mgr.registerChecker<MyChecker>(); |
| 18 | llvm::outs() << "Example option is set to " |
| 19 | << (Mgr.getAnalyzerOptions().getCheckerBooleanOption( |
| 20 | C: Checker, OptionName: "ExampleOption") |
| 21 | ? "true" |
| 22 | : "false") |
| 23 | << '\n'; |
| 24 | } |
| 25 | |
| 26 | bool shouldRegisterMyChecker(const CheckerManager &mgr) { return true; } |
| 27 | |
| 28 | } // end anonymous namespace |
| 29 | |
| 30 | // Register plugin! |
| 31 | extern "C"void clang_registerCheckers(CheckerRegistry &Registry) { |
| 32 | Registry.addChecker(Fn: registerMyChecker, Sfn: shouldRegisterMyChecker, |
| 33 | FullName: "example.MyChecker", Desc: "Example Description"); |
| 34 | |
| 35 | Registry.addCheckerOption(/*OptionType*/ "bool", |
| 36 | /*CheckerFullName*/ "example.MyChecker", |
| 37 | /*OptionName*/ "ExampleOption", |
| 38 | /*DefaultValStr*/ "false", |
| 39 | /*Description*/ "This is an example checker opt.", |
| 40 | /*DevelopmentStage*/ DevelopmentStatus: "released"); |
| 41 | } |
| 42 | |
| 43 | extern "C"const char clang_analyzerAPIVersionString[] = |
| 44 | CLANG_ANALYZER_API_VERSION_STRING; |
| 45 |