r335740 - [analyzer] Allow registering custom statically-linked analyzer checkers

Mikael Holmén via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 27 23:26:30 PDT 2018


Hi,

I get the same compilation error when  I compile with clang 3.6.0.

Revert?

Regards,
Mikael

On 06/28/2018 03:16 AM, via cfe-commits wrote:
> Hi, this commit also broke our internal bot for a different reason:
> 
> FAILED: /usr/lib/ccache/clang++   -DGTEST_HAS_RTTI=0 
> -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_LANG_CXX11=1 -D_DEBUG -D_GNU_SOURCE 
> -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS 
> -Itools/clang/unittests/StaticAnalyzer 
> -I/home/siadmin/jenkins/w/opensource/opensource_build/llvm/tools/clang/unittests/StaticAnalyzer 
> -I/home/siadmin/jenkins/w/opensource/opensource_build/llvm/tools/clang/include 
> -Itools/clang/include -Iinclude 
> -I/home/siadmin/jenkins/w/opensource/opensource_build/llvm/include 
> -I/home/siadmin/jenkins/w/opensource/opensource_build/llvm/utils/unittest/googletest/include 
> -I/home/siadmin/jenkins/w/opensource/opensource_build/llvm/utils/unittest/googlemock/include 
> -fPIC -fvisibility-inlines-hidden -Werror=date-time -std=c++11 -Wall 
> -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual 
> -Wmissing-field-initializers -pedantic -Wno-long-long 
> -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor 
> -Wstring-conversion -fdiagnostics-color -ffunction-sections 
> -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types 
> -O3    -UNDEBUG  -Wno-variadic-macros 
> -Wno-gnu-zero-variadic-macro-arguments -fno-exceptions -fno-rtti -MMD 
> -MT 
> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o 
> -MF 
> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o.d 
> -o 
> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o 
> -c 
> /home/siadmin/jenkins/w/opensource/opensource_build/llvm/tools/clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
> 
> /home/siadmin/jenkins/w/opensource/opensource_build/llvm/tools/clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp:64:12: 
> error: no viable conversion from 
> 'unique_ptr<clang::ento::AnalysisASTConsumer>' to 
> 'unique_ptr<clang::ASTConsumer>'
> 
>      return AnalysisConsumer;
> 
>             ^~~~~~~~~~~~~~~~
> 
> /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unique_ptr.h:157:17: 
> note: candidate constructor not viable: no known conversion from 
> 'std::unique_ptr<AnalysisASTConsumer>' to 'nullptr_t' for 1st argument
> 
>        constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { }
> 
>                  ^
> 
> /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unique_ptr.h:160:7: 
> note: candidate constructor not viable: no known conversion from 
> 'std::unique_ptr<AnalysisASTConsumer>' to 
> 'std::unique_ptr<clang::ASTConsumer, 
> std::default_delete<clang::ASTConsumer> > &&' for 1st argument
> 
>        unique_ptr(unique_ptr&& __u) noexcept
> 
>        ^
> 
> /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unique_ptr.h:169:2: 
> note: candidate constructor [with _Up = 
> clang::ento::AnalysisASTConsumer, _Ep = 
> std::default_delete<clang::ento::AnalysisASTConsumer>, $2 = void] not 
> viable: no known conversion from 'std::unique_ptr<AnalysisASTConsumer>' 
> to 'unique_ptr<clang::ento::AnalysisASTConsumer, 
> std::default_delete<clang::ento::AnalysisASTConsumer> > &&' for 1st argument
> 
>          unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept
> 
>          ^
> 
> /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unique_ptr.h:273:7: 
> note: candidate constructor not viable: no known conversion from 
> 'std::unique_ptr<AnalysisASTConsumer>' to 'const 
> std::unique_ptr<clang::ASTConsumer, 
> std::default_delete<clang::ASTConsumer> > &' for 1st argument
> 
>        unique_ptr(const unique_ptr&) = delete;
> 
>        ^
> 
> /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unique_ptr.h:176:2: 
> note: candidate template ignored: could not match 'auto_ptr' against 
> 'unique_ptr'
> 
>          unique_ptr(auto_ptr<_Up>&& __u) noexcept;
> 
>          ^
> 
> 1 error generated.
> 
> Douglas Yung
> 
> *From:*cfe-commits [mailto:cfe-commits-bounces at lists.llvm.org] *On 
> Behalf Of *Artem Belevich via cfe-commits
> *Sent:* Wednesday, June 27, 2018 14:30
> *To:* Alexander Kornienko
> *Cc:* cfe-commits
> *Subject:* Re: r335740 - [analyzer] Allow registering custom 
> statically-linked analyzer checkers
> 
> FYI,
> 
> This commit breaks clang tests. It appears that StaticAnalysisTests 
> misses dependency on clangFrontend.
> 
> --Artem
> 
> [60/134] Linking CXX executable 
> tools/clang/unittests/StaticAnalyzer/StaticAnalysisTests
> 
> FAILED: tools/clang/unittests/StaticAnalyzer/StaticAnalysisTests
> 
> : && /usr/local/google/home/tra/local/clang/bin/clang++   -fPIC 
> -fvisibility-inlines-hidden -Werror=date-time 
> -Werror=unguarded-availability-new -std=c++11 -Wall -Wextra 
> -Wno-unused-parameter -Wwrite-strings -Wcast-qual 
> -Wmissing-field-initializers -pedantic -Wno-long-long 
> -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor 
> -Wstring-conversion -fdiagnostics-color -fno-common -Woverloaded-virtual 
> -Wno-nested-anon-types -g  -fuse-ld=lld -Xlinker --gdb-index 
> -fuse-ld=lld -Wl,--color-diagnostics -Wl,-allow-shlib-undefined 
> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/AnalyzerOptionsTest.cpp.o 
> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o 
> -o tools/clang/unittests/StaticAnalyzer/StaticAnalysisTests  
> lib/libLLVMSupport.so.7svn -lpthread lib/libgtest_main.so.7svn 
> lib/libgtest.so.7svn -lpthread lib/libclangBasic.so.7svn 
> lib/libclangAnalysis.so.7svn lib/libclangStaticAnalyzerCore.so.7svn 
> lib/libclangStaticAnalyzerFrontend.so.7svn lib/libclangTooling.so.7svn 
> -Wl,-rpath,/usr/local/google/home/tra/work/llvm/build/release+assert/lib 
> && :
> 
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined 
> symbol: clang::FrontendAction::FrontendAction()
> 
>>>> referenced by FrontendAction.h:235 (/usr/local/google/home/tra/work/llvm/repo/clang/include/clang/Frontend/FrontendAction.h:235)
> 
>>>>               tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(clang::ASTFrontendAction::ASTFrontendAction())
> 
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined 
> symbol: vtable for clang::ASTFrontendAction
> 
>>>> referenced by FrontendAction.h:235 (/usr/local/google/home/tra/work/llvm/repo/clang/include/clang/Frontend/FrontendAction.h:235)
> 
>>>>               tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(clang::ASTFrontendAction::ASTFrontendAction())
> 
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined 
> symbol: clang::FrontendAction::~FrontendAction()
> 
>>>> referenced by FrontendAction.h:225 (/usr/local/google/home/tra/work/llvm/repo/clang/include/clang/Frontend/FrontendAction.h:225)
> 
>>>>               tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(clang::ASTFrontendAction::~ASTFrontendAction())
> 
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined 
> symbol: clang::PCHContainerOperations::PCHContainerOperations()
> 
>>>> referenced by new_allocator.h:136 (/usr/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/ext/new_allocator.h:136)
> 
>>>>               tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(void __gnu_cxx::new_allocator<clang::PCHContainerOperations>::construct<clang::PCHContainerOperations>(clang::PCHContainerOperations*))
> 
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined 
> symbol: clang::ASTFrontendAction::ExecuteAction()
> 
>>>> referenced by RegisterCustomCheckersTest.cpp
> 
>>>>               tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(vtable for clang::ento::(anonymous namespace)::TestAction)
> 
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined 
> symbol: clang::FrontendAction::shouldEraseOutputFiles()
> 
>>>> referenced by RegisterCustomCheckersTest.cpp
> 
>>>>               tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(vtable for clang::ento::(anonymous namespace)::TestAction)
> 
> clang: error: linker command failed with exit code 1 (use -v to see 
> invocation)
> 
> On Wed, Jun 27, 2018 at 8:00 AM Alexander Kornienko via cfe-commits 
> <cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>> wrote:
> 
>     Author: alexfh
>     Date: Wed Jun 27 07:56:12 2018
>     New Revision: 335740
> 
>     URL: http://llvm.org/viewvc/llvm-project?rev=335740&view=rev
>     Log:
>     [analyzer] Allow registering custom statically-linked analyzer checkers
> 
>     Summary:
>     Add an extension point to allow registration of statically-linked
>     Clang Static
>     Analyzer checkers that are not a part of the Clang tree. This
>     extension point
>     employs the mechanism used when checkers are registered from
>     dynamically loaded
>     plugins.
> 
>     Reviewers: george.karpenkov, NoQ, xazax.hun, dcoughlin
> 
>     Reviewed By: george.karpenkov
> 
>     Subscribers: mgorny, mikhail.ramalho, rnkovacs, xazax.hun, szepet,
>     a.sidorin, cfe-commits
> 
>     Differential Revision: https://reviews.llvm.org/D45718
> 
>     Added:
>          cfe/trunk/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
>     Modified:
>          cfe/trunk/include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h
>         
>     cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h
>          cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
>          cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
>          cfe/trunk/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
>          cfe/trunk/unittests/StaticAnalyzer/CMakeLists.txt
> 
>     Modified:
>     cfe/trunk/include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h?rev=335740&r1=335739&r2=335740&view=diff
>     ==============================================================================
>     ---
>     cfe/trunk/include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h
>     (original)
>     +++
>     cfe/trunk/include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h
>     Wed Jun 27 07:56:12 2018
>     @@ -17,6 +17,7 @@
> 
>       #include "clang/AST/ASTConsumer.h"
>       #include "clang/Basic/LLVM.h"
>     +#include <functional>
>       #include <memory>
> 
>       namespace clang {
>     @@ -29,10 +30,24 @@ class CompilerInstance;
>       namespace ento {
>       class PathDiagnosticConsumer;
>       class CheckerManager;
>     +class CheckerRegistry;
> 
>       class AnalysisASTConsumer : public ASTConsumer {
>       public:
>         virtual void AddDiagnosticConsumer(PathDiagnosticConsumer
>     *Consumer) = 0;
>     +
>     +  /// This method allows registering statically linked custom
>     checkers that are
>     +  /// not a part of the Clang tree. It employs the same mechanism
>     that is used
>     +  /// by plugins.
>     +  ///
>     +  /// Example:
>     +  ///
>     +  ///   Consumer->AddCheckerRegistrationFn([] (CheckerRegistry&
>     Registry) {
>     +  ///   
>       Registry.addChecker<MyCustomChecker>("example.MyCustomChecker",
>     +  ///                                          "Description");
>     +  ///   });
>     +  virtual void
>     +  AddCheckerRegistrationFn(std::function<void(CheckerRegistry &)>
>     Fn) = 0;
>       };
> 
>       /// CreateAnalysisConsumer - Creates an ASTConsumer to run various
>     code
> 
>     Modified:
>     cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h?rev=335740&r1=335739&r2=335740&view=diff
>     ==============================================================================
>     ---
>     cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h (original)
>     +++
>     cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h Wed
>     Jun 27 07:56:12 2018
>     @@ -11,6 +11,7 @@
>       #define LLVM_CLANG_STATICANALYZER_FRONTEND_CHECKERREGISTRATION_H
> 
>       #include "clang/Basic/LLVM.h"
>     +#include <functional>
>       #include <memory>
>       #include <string>
> 
>     @@ -21,10 +22,13 @@ namespace clang {
> 
>       namespace ento {
>         class CheckerManager;
>     +  class CheckerRegistry;
> 
>     -  std::unique_ptr<CheckerManager>
>     -  createCheckerManager(AnalyzerOptions &opts, const LangOptions
>     &langOpts,
>     -                       ArrayRef<std::string> plugins,
>     DiagnosticsEngine &diags);
>     +  std::unique_ptr<CheckerManager> createCheckerManager(
>     +      AnalyzerOptions &opts, const LangOptions &langOpts,
>     +      ArrayRef<std::string> plugins,
>     +      ArrayRef<std::function<void(CheckerRegistry &)>>
>     checkerRegistrationFns,
>     +      DiagnosticsEngine &diags);
> 
>       } // end ento namespace
> 
> 
>     Modified: cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp?rev=335740&r1=335739&r2=335740&view=diff
>     ==============================================================================
>     --- cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
>     (original)
>     +++ cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp Wed
>     Jun 27 07:56:12 2018
>     @@ -164,6 +164,8 @@ class AnalysisConsumer : public Analysis
>         /// Bug Reporter to use while recursively visiting Decls.
>         BugReporter *RecVisitorBR;
> 
>     +  std::vector<std::function<void(CheckerRegistry &)>>
>     CheckerRegistrationFns;
>     +
>       public:
>         ASTContext *Ctx;
>         const Preprocessor &PP;
>     @@ -293,8 +295,9 @@ public:
> 
>         void Initialize(ASTContext &Context) override {
>           Ctx = &Context;
>     -    checkerMgr = createCheckerManager(*Opts, PP.getLangOpts(), Plugins,
>     -                                      PP.getDiagnostics());
>     +    checkerMgr =
>     +        createCheckerManager(*Opts, PP.getLangOpts(), Plugins,
>     +                             CheckerRegistrationFns,
>     PP.getDiagnostics());
> 
>           Mgr = llvm::make_unique<AnalysisManager>(
>               *Ctx, PP.getDiagnostics(), PP.getLangOpts(), PathConsumers,
>     @@ -385,6 +388,10 @@ public:
>           PathConsumers.push_back(Consumer);
>         }
> 
>     +  void
>     AddCheckerRegistrationFn(std::function<void(CheckerRegistry&)> Fn)
>     override {
>     +    CheckerRegistrationFns.push_back(std::move(Fn));
>     +  }
>     +
>       private:
>         void storeTopLevelDecls(DeclGroupRef DG);
>         std::string getFunctionName(const Decl *D);
> 
>     Modified: cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp?rev=335740&r1=335739&r2=335740&view=diff
>     ==============================================================================
>     --- cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
>     (original)
>     +++ cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
>     Wed Jun 27 07:56:12 2018
>     @@ -111,16 +111,21 @@ getCheckerOptList(const AnalyzerOptions
>         return checkerOpts;
>       }
> 
>     -std::unique_ptr<CheckerManager>
>     -ento::createCheckerManager(AnalyzerOptions &opts, const LangOptions
>     &langOpts,
>     -                           ArrayRef<std::string> plugins,
>     -                           DiagnosticsEngine &diags) {
>     +std::unique_ptr<CheckerManager> ento::createCheckerManager(
>     +    AnalyzerOptions &opts, const LangOptions &langOpts,
>     +    ArrayRef<std::string> plugins,
>     +    ArrayRef<std::function<void(CheckerRegistry &)>>
>     checkerRegistrationFns,
>     +    DiagnosticsEngine &diags) {
>         std::unique_ptr<CheckerManager> checkerMgr(
>             new CheckerManager(langOpts, opts));
> 
>         SmallVector<CheckerOptInfo, 8> checkerOpts =
>     getCheckerOptList(opts);
> 
>         ClangCheckerRegistry allCheckers(plugins, &diags);
>     +
>     +  for (const auto &Fn : checkerRegistrationFns)
>     +    Fn(allCheckers);
>     +
>         allCheckers.initializeManager(*checkerMgr, checkerOpts);
>         allCheckers.validateCheckerOptions(opts, diags);
>         checkerMgr->finishedCheckerRegistration();
> 
>     Modified: cfe/trunk/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp?rev=335740&r1=335739&r2=335740&view=diff
>     ==============================================================================
>     --- cfe/trunk/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
>     (original)
>     +++ cfe/trunk/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp Wed
>     Jun 27 07:56:12 2018
>     @@ -1,4 +1,4 @@
>     -//===- unittest/Analysis/AnalyzerOptionsTest.cpp - SA Options test
>     --------===//
>     +//===- unittest/StaticAnalyzer/AnalyzerOptionsTest.cpp - SA Options
>     test --===//
>       //
>       //                     The LLVM Compiler Infrastructure
>       //
> 
>     Modified: cfe/trunk/unittests/StaticAnalyzer/CMakeLists.txt
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/StaticAnalyzer/CMakeLists.txt?rev=335740&r1=335739&r2=335740&view=diff
>     ==============================================================================
>     --- cfe/trunk/unittests/StaticAnalyzer/CMakeLists.txt (original)
>     +++ cfe/trunk/unittests/StaticAnalyzer/CMakeLists.txt Wed Jun 27
>     07:56:12 2018
>     @@ -4,11 +4,14 @@ set(LLVM_LINK_COMPONENTS
> 
>       add_clang_unittest(StaticAnalysisTests
>         AnalyzerOptionsTest.cpp
>     +  RegisterCustomCheckersTest.cpp
>         )
> 
>       target_link_libraries(StaticAnalysisTests
>         PRIVATE
>         clangBasic
>         clangAnalysis
>     -  clangStaticAnalyzerCore
>     +  clangStaticAnalyzerCore
>     +  clangStaticAnalyzerFrontend
>     +  clangTooling
>         )
> 
>     Added: cfe/trunk/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp?rev=335740&view=auto
>     ==============================================================================
>     ---
>     cfe/trunk/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
>     (added)
>     +++
>     cfe/trunk/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
>     Wed Jun 27 07:56:12 2018
>     @@ -0,0 +1,80 @@
>     +//===- unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
>     ------------===//
>     +//
>     +//                     The LLVM Compiler Infrastructure
>     +//
>     +// This file is distributed under the University of Illinois Open
>     Source
>     +// License. See LICENSE.TXT for details.
>     +//
>     +//===----------------------------------------------------------------------===//
>     +
>     +#include "clang/Frontend/CompilerInstance.h"
>     +#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
>     +#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
>     +#include "clang/StaticAnalyzer/Core/Checker.h"
>     +#include "clang/StaticAnalyzer/Core/CheckerRegistry.h"
>     +#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
>     +#include "clang/StaticAnalyzer/Frontend/AnalysisConsumer.h"
>     +#include "clang/Tooling/Tooling.h"
>     +#include "gtest/gtest.h"
>     +
>     +namespace clang {
>     +namespace ento {
>     +namespace {
>     +
>     +class CustomChecker : public Checker<check::ASTCodeBody> {
>     +public:
>     +  void checkASTCodeBody(const Decl *D, AnalysisManager &Mgr,
>     +                        BugReporter &BR) const {
>     +    BR.EmitBasicReport(D, this, "Custom diagnostic",
>     categories::LogicError,
>     +                       "Custom diagnostic description",
>     +                       PathDiagnosticLocation(D,
>     Mgr.getSourceManager()), {});
>     +  }
>     +};
>     +
>     +class TestAction : public ASTFrontendAction {
>     +  class DiagConsumer : public PathDiagnosticConsumer {
>     +    llvm::raw_ostream &Output;
>     +
>     +  public:
>     +    DiagConsumer(llvm::raw_ostream &Output) : Output(Output) {}
>     +    void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *>
>     &Diags,
>     +                              FilesMade *filesMade) override {
>     +      for (const auto *PD : Diags)
>     +        Output << PD->getCheckName() << ":" <<
>     PD->getShortDescription();
>     +    }
>     +
>     +    StringRef getName() const override { return "Test"; }
>     +  };
>     +
>     +  llvm::raw_ostream &DiagsOutput;
>     +
>     +public:
>     +  TestAction(llvm::raw_ostream &DiagsOutput) :
>     DiagsOutput(DiagsOutput) {}
>     +
>     +  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance
>     &Compiler,
>     +                                                 StringRef File)
>     override {
>     +    std::unique_ptr<AnalysisASTConsumer> AnalysisConsumer =
>     +        CreateAnalysisConsumer(Compiler);
>     +    AnalysisConsumer->AddDiagnosticConsumer(new
>     DiagConsumer(DiagsOutput));
>     +    Compiler.getAnalyzerOpts()->CheckersControlList = {
>     +        {"custom.CustomChecker", true}};
>     +    AnalysisConsumer->AddCheckerRegistrationFn([](CheckerRegistry
>     &Registry) {
>     +      Registry.addChecker<CustomChecker>("custom.CustomChecker",
>     "Description");
>     +    });
>     +    return AnalysisConsumer;
>     +  }
>     +};
>     +
>     +
>     +TEST(RegisterCustomCheckers, RegisterChecker) {
>     +  std::string Diags;
>     +  {
>     +    llvm::raw_string_ostream OS(Diags);
>     +    EXPECT_TRUE(tooling::runToolOnCode(new TestAction(OS), "void
>     f() {;}"));
>     +  }
>     +  EXPECT_EQ(Diags, "custom.CustomChecker:Custom diagnostic
>     description");
>     +}
>     +
>     +}
>     +}
>     +}
> 
> 
>     _______________________________________________
>     cfe-commits mailing list
>     cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>
>     http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> 
> 
> -- 
> 
> --Artem Belevich
> 
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> 



More information about the cfe-commits mailing list