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 |