zhaoyonggang via llvm-dev
2020-Sep-27 08:39 UTC
[llvm-dev] How to add a new clang-tidy module
Hi, all, I am planning to add clang-tidy checkers for my company. How to add a new module for my company? Please help, thanks in advance. I try to copy files from cert module, and rename cert to Misra, then add a rule named "m-0-1-1" by ./add_new_checker.py. then I run ninja check-clang-tool, but my case is failed due to below error Running ['clang-tidy', '/Users/zyg/Documents/workspace/llvm-project/llvm/cmake-build-debug/tools/clang/tools/extra/test/clang-tidy/checkers/Output/misra-m-0-1-1.cpp.tmp.cpp', '-fix', '--checks=-*,misra-m-0-1-1', '-format-style=none', '--', '-std=c++11', '-nostdinc++']... clang-tidy failed: Error: no checks enabled. USAGE: clang-tidy [options] <source0> [... <sourceN>] Below is my diff diff --git a/clang-tools-extra/clang-tidy/CMakeLists.txt b/clang-tools-extra/clang-tidy/CMakeLists.txt index ca7a5afed6b..ccb77ef6a62 100644 --- a/clang-tools-extra/clang-tidy/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/CMakeLists.txt @@ -64,6 +64,7 @@ add_subdirectory(linuxkernel) add_subdirectory(llvm) add_subdirectory(llvmlibc) add_subdirectory(misc) +add_subdirectory(misra) add_subdirectory(modernize) if(CLANG_TIDY_ENABLE_STATIC_ANALYZER) add_subdirectory(mpi) @@ -90,6 +91,7 @@ set(ALL_CLANG_TIDY_CHECKS clangTidyLLVMModule clangTidyLLVMLibcModule clangTidyMiscModule + clangTidyMISRAModule clangTidyModernizeModule clangTidyObjCModule clangTidyOpenMPModule diff --git a/clang-tools-extra/clang-tidy/misra/CMakeLists.txt b/clang-tools-extra/clang-tidy/misra/CMakeLists.txt new file mode 100644 index 00000000000..ca345a946c9 --- /dev/null +++ b/clang-tools-extra/clang-tidy/misra/CMakeLists.txt @@ -0,0 +1,28 @@ +set(LLVM_LINK_COMPONENTS + support + FrontendOpenMP + ) + +add_clang_library(clangTidyMISRAModule + M011Check.cpp + MISRATidyModule.cpp + LINK_LIBS + clangTidy + clangTidyBugproneModule + clangTidyGoogleModule + clangTidyMiscModule + clangTidyPerformanceModule + clangTidyReadabilityModule + clangTidyUtils + + DEPENDS + omp_gen +) + +clang_target_link_libraries(clangTidyMISRAModule + PRIVATE + clangAST + clangASTMatchers + clangBasic + clangLex + ) diff --git a/clang-tools-extra/clang-tidy/misra/M011Check.cpp b/clang-tools-extra/clang-tidy/misra/M011Check.cpp new file mode 100644 index 00000000000..ebc0ba3bbe0 --- /dev/null +++ b/clang-tools-extra/clang-tidy/misra/M011Check.cpp @@ -0,0 +1,37 @@ +//===--- M011Check.cpp - clang-tidy ---------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "M011Check.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace misra { + +void M011Check::registerMatchers(MatchFinder *Finder) { + // FIXME: Add matchers. + Finder->addMatcher(functionDecl().bind("x"), this); +} + +void M011Check::check(const MatchFinder::MatchResult &Result) { + // FIXME: Add callback implementation. + const auto *MatchedDecl = Result.Nodes.getNodeAs<FunctionDecl>("x"); + if (!MatchedDecl->getIdentifier() || MatchedDecl->getName().startswith("awesome_")) + return; + diag(MatchedDecl->getLocation(), "function %0 is insufficiently awesome") + << MatchedDecl; + diag(MatchedDecl->getLocation(), "insert 'awesome'", DiagnosticIDs::Note) + << FixItHint::CreateInsertion(MatchedDecl->getLocation(), "awesome_"); +} + +} // namespace misra +} // namespace tidy +} // namespace clang diff --git a/clang-tools-extra/clang-tidy/misra/M011Check.h b/clang-tools-extra/clang-tidy/misra/M011Check.h new file mode 100644 index 00000000000..289d54545c7 --- /dev/null +++ b/clang-tools-extra/clang-tidy/misra/M011Check.h @@ -0,0 +1,34 @@ +//===--- M011Check.h - clang-tidy -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H + +#include "../ClangTidyCheck.h" + +namespace clang { +namespace tidy { +namespace misra { + +/// FIXME: Write a short description. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/misra-m-0-1-1.html +class M011Check : public ClangTidyCheck { +public: + M011Check(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace misra +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H diff --git a/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp b/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp new file mode 100644 index 00000000000..cb78fa7efe0 --- /dev/null +++ b/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp @@ -0,0 +1,46 @@ +//===--- CERTTidyModule.cpp - clang-tidy ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "../ClangTidy.h" +#include "../ClangTidyModule.h" +#include "../ClangTidyModuleRegistry.h" +#include "M011Check.h" + + +namespace clang { +namespace tidy { +namespace misra { + +class MISRAModule : public ClangTidyModule { +public: + void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { + // C++ checkers + + CheckFactories.registerCheck<M011Check>( + "misra-m-0-1-1"); + } + + ClangTidyOptions getModuleOptions() override { + ClangTidyOptions Options; + return Options; + } +}; + +} // namespace misra + +// Register the MiscTidyModule using this statically initialized variable. +static ClangTidyModuleRegistry::Add<misra::MISRAModule> + X("misra-module", + "Adds lint checks corresponding to CERT secure coding guidelines."); + +// This anchor is used to force the linker to link in the generated object file +// and thus register the CERTModule. +volatile int MISRAModuleAnchorSource = 0; + +} // namespace tidy +} // namespace clang diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index 62bfd314920..144bd80eaab 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -213,6 +213,7 @@ Clang-Tidy Checks `misc-unused-alias-decls <misc-unused-alias-decls.html>`_, "Yes" `misc-unused-parameters <misc-unused-parameters.html>`_, "Yes" `misc-unused-using-decls <misc-unused-using-decls.html>`_, "Yes" + `misra-m-0-1-1 <misra-m-0-1-1.html>`_, "Yes" `modernize-avoid-bind <modernize-avoid-bind.html>`_, "Yes" `modernize-avoid-c-arrays <modernize-avoid-c-arrays.html>`_, `modernize-concat-nested-namespaces <modernize-concat-nested-namespaces.html>`_, "Yes" diff --git a/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst b/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst new file mode 100644 index 00000000000..7fd1cefbca8 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst @@ -0,0 +1,6 @@ +.. title:: clang-tidy - misra-m-0-1-1 + +misra-m-0-1-1 +============+ +FIXME: Describe what patterns does the check detect and why. Give examples. diff --git a/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp b/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp new file mode 100644 index 00000000000..382524ac36b --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp @@ -0,0 +1,14 @@ +// RUN: %check_clang_tidy %s misra-m-0-1-1 %t + +// FIXME: Add something that triggers the check here. +void f(); +// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'f' is insufficiently awesome [misra-m-0-1-1] + +// FIXME: Verify the applied fix. +// * Make the CHECK patterns specific enough and try to make verified lines +// unique to avoid incorrect matches. +// * Use {{}} for regular expressions. +// CHECK-FIXES: {{^}}void awesome_f();{{$}} + +// FIXME: Add something that doesn't trigger the check here. +void awesome_f2();
Roman Lebedev via llvm-dev
2020-Sep-27 08:57 UTC
[llvm-dev] How to add a new clang-tidy module
See https://reviews.llvm.org/D36836 for modern example of minimal scaffolding. Roman On Sun, Sep 27, 2020 at 11:39 AM zhaoyonggang via llvm-dev <llvm-dev at lists.llvm.org> wrote:> > Hi, all, > > I am planning to add clang-tidy checkers for my company. How to add a new module for my company? Please help, thanks in advance. > > I try to copy files from cert module, and rename cert to Misra, then add a rule named "m-0-1-1" by ./add_new_checker.py. > > then I run ninja check-clang-tool, but my case is failed due to below error > > Running ['clang-tidy', '/Users/zyg/Documents/workspace/llvm-project/llvm/cmake-build-debug/tools/clang/tools/extra/test/clang-tidy/checkers/Output/misra-m-0-1-1.cpp.tmp.cpp', '-fix', '--checks=-*,misra-m-0-1-1', '-format-style=none', '--', '-std=c++11', '-nostdinc++']... clang-tidy failed: Error: no checks enabled. USAGE: clang-tidy [options] <source0> [... <sourceN>] > > > > Below is my diff > > > diff --git a/clang-tools-extra/clang-tidy/CMakeLists.txt b/clang-tools-extra/clang-tidy/CMakeLists.txt > index ca7a5afed6b..ccb77ef6a62 100644 > --- a/clang-tools-extra/clang-tidy/CMakeLists.txt > +++ b/clang-tools-extra/clang-tidy/CMakeLists.txt > @@ -64,6 +64,7 @@ add_subdirectory(linuxkernel) > add_subdirectory(llvm) > add_subdirectory(llvmlibc) > add_subdirectory(misc) > +add_subdirectory(misra) > add_subdirectory(modernize) > if(CLANG_TIDY_ENABLE_STATIC_ANALYZER) > add_subdirectory(mpi) > @@ -90,6 +91,7 @@ set(ALL_CLANG_TIDY_CHECKS > clangTidyLLVMModule > clangTidyLLVMLibcModule > clangTidyMiscModule > + clangTidyMISRAModule > clangTidyModernizeModule > clangTidyObjCModule > clangTidyOpenMPModule > diff --git a/clang-tools-extra/clang-tidy/misra/CMakeLists.txt b/clang-tools-extra/clang-tidy/misra/CMakeLists.txt > new file mode 100644 > index 00000000000..ca345a946c9 > --- /dev/null > +++ b/clang-tools-extra/clang-tidy/misra/CMakeLists.txt > @@ -0,0 +1,28 @@ > +set(LLVM_LINK_COMPONENTS > + support > + FrontendOpenMP > + ) > + > +add_clang_library(clangTidyMISRAModule > + M011Check.cpp > + MISRATidyModule.cpp > + LINK_LIBS > + clangTidy > + clangTidyBugproneModule > + clangTidyGoogleModule > + clangTidyMiscModule > + clangTidyPerformanceModule > + clangTidyReadabilityModule > + clangTidyUtils > + > + DEPENDS > + omp_gen > +) > + > +clang_target_link_libraries(clangTidyMISRAModule > + PRIVATE > + clangAST > + clangASTMatchers > + clangBasic > + clangLex > + ) > diff --git a/clang-tools-extra/clang-tidy/misra/M011Check.cpp b/clang-tools-extra/clang-tidy/misra/M011Check.cpp > new file mode 100644 > index 00000000000..ebc0ba3bbe0 > --- /dev/null > +++ b/clang-tools-extra/clang-tidy/misra/M011Check.cpp > @@ -0,0 +1,37 @@ > +//===--- M011Check.cpp - clang-tidy ---------------------------------------===// > +// > +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. > +// See https://llvm.org/LICENSE.txt for license information. > +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception > +// > +//===----------------------------------------------------------------------===// > + > +#include "M011Check.h" > +#include "clang/AST/ASTContext.h" > +#include "clang/ASTMatchers/ASTMatchFinder.h" > + > +using namespace clang::ast_matchers; > + > +namespace clang { > +namespace tidy { > +namespace misra { > + > +void M011Check::registerMatchers(MatchFinder *Finder) { > + // FIXME: Add matchers. > + Finder->addMatcher(functionDecl().bind("x"), this); > +} > + > +void M011Check::check(const MatchFinder::MatchResult &Result) { > + // FIXME: Add callback implementation. > + const auto *MatchedDecl = Result.Nodes.getNodeAs<FunctionDecl>("x"); > + if (!MatchedDecl->getIdentifier() || MatchedDecl->getName().startswith("awesome_")) > + return; > + diag(MatchedDecl->getLocation(), "function %0 is insufficiently awesome") > + << MatchedDecl; > + diag(MatchedDecl->getLocation(), "insert 'awesome'", DiagnosticIDs::Note) > + << FixItHint::CreateInsertion(MatchedDecl->getLocation(), "awesome_"); > +} > + > +} // namespace misra > +} // namespace tidy > +} // namespace clang > diff --git a/clang-tools-extra/clang-tidy/misra/M011Check.h b/clang-tools-extra/clang-tidy/misra/M011Check.h > new file mode 100644 > index 00000000000..289d54545c7 > --- /dev/null > +++ b/clang-tools-extra/clang-tidy/misra/M011Check.h > @@ -0,0 +1,34 @@ > +//===--- M011Check.h - clang-tidy -------------------------------*- C++ -*-===// > +// > +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. > +// See https://llvm.org/LICENSE.txt for license information. > +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception > +// > +//===----------------------------------------------------------------------===// > + > +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H > +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H > + > +#include "../ClangTidyCheck.h" > + > +namespace clang { > +namespace tidy { > +namespace misra { > + > +/// FIXME: Write a short description. > +/// > +/// For the user-facing documentation see: > +/// http://clang.llvm.org/extra/clang-tidy/checks/misra-m-0-1-1.html > +class M011Check : public ClangTidyCheck { > +public: > + M011Check(StringRef Name, ClangTidyContext *Context) > + : ClangTidyCheck(Name, Context) {} > + void registerMatchers(ast_matchers::MatchFinder *Finder) override; > + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; > +}; > + > +} // namespace misra > +} // namespace tidy > +} // namespace clang > + > +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H > diff --git a/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp b/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp > new file mode 100644 > index 00000000000..cb78fa7efe0 > --- /dev/null > +++ b/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp > @@ -0,0 +1,46 @@ > +//===--- CERTTidyModule.cpp - clang-tidy ----------------------------------===// > +// > +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. > +// See https://llvm.org/LICENSE.txt for license information. > +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception > +// > +//===----------------------------------------------------------------------===// > + > +#include "../ClangTidy.h" > +#include "../ClangTidyModule.h" > +#include "../ClangTidyModuleRegistry.h" > +#include "M011Check.h" > + > + > +namespace clang { > +namespace tidy { > +namespace misra { > + > +class MISRAModule : public ClangTidyModule { > +public: > + void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { > + // C++ checkers > + > + CheckFactories.registerCheck<M011Check>( > + "misra-m-0-1-1"); > + } > + > + ClangTidyOptions getModuleOptions() override { > + ClangTidyOptions Options; > + return Options; > + } > +}; > + > +} // namespace misra > + > +// Register the MiscTidyModule using this statically initialized variable. > +static ClangTidyModuleRegistry::Add<misra::MISRAModule> > + X("misra-module", > + "Adds lint checks corresponding to CERT secure coding guidelines."); > + > +// This anchor is used to force the linker to link in the generated object file > +// and thus register the CERTModule. > +volatile int MISRAModuleAnchorSource = 0; > + > +} // namespace tidy > +} // namespace clang > diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst > index 62bfd314920..144bd80eaab 100644 > --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst > +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst > @@ -213,6 +213,7 @@ Clang-Tidy Checks > `misc-unused-alias-decls <misc-unused-alias-decls.html>`_, "Yes" > `misc-unused-parameters <misc-unused-parameters.html>`_, "Yes" > `misc-unused-using-decls <misc-unused-using-decls.html>`_, "Yes" > + `misra-m-0-1-1 <misra-m-0-1-1.html>`_, "Yes" > `modernize-avoid-bind <modernize-avoid-bind.html>`_, "Yes" > `modernize-avoid-c-arrays <modernize-avoid-c-arrays.html>`_, > `modernize-concat-nested-namespaces <modernize-concat-nested-namespaces.html>`_, "Yes" > diff --git a/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst b/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst > new file mode 100644 > index 00000000000..7fd1cefbca8 > --- /dev/null > +++ b/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst > @@ -0,0 +1,6 @@ > +.. title:: clang-tidy - misra-m-0-1-1 > + > +misra-m-0-1-1 > +============> + > +FIXME: Describe what patterns does the check detect and why. Give examples. > diff --git a/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp b/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp > new file mode 100644 > index 00000000000..382524ac36b > --- /dev/null > +++ b/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp > @@ -0,0 +1,14 @@ > +// RUN: %check_clang_tidy %s misra-m-0-1-1 %t > + > +// FIXME: Add something that triggers the check here. > +void f(); > +// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'f' is insufficiently awesome [misra-m-0-1-1] > + > +// FIXME: Verify the applied fix. > +// * Make the CHECK patterns specific enough and try to make verified lines > +// unique to avoid incorrect matches. > +// * Use {{}} for regular expressions. > +// CHECK-FIXES: {{^}}void awesome_f();{{$}} > + > +// FIXME: Add something that doesn't trigger the check here. > +void awesome_f2(); > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
zhaoyonggang via llvm-dev
2020-Sep-27 09:01 UTC
[llvm-dev] How to add a new clang-tidy module
Hi, Roman, Thanks a lot, root cause should be like below. I am not familiar with this linker magic, :(> On Sep 27, 2020, at 4:57 PM, Roman Lebedev <lebedev.ri at gmail.com> wrote: > > See https://reviews.llvm.org/D36836 for modern example of minimal scaffolding. > > Roman > > On Sun, Sep 27, 2020 at 11:39 AM zhaoyonggang via llvm-dev > <llvm-dev at lists.llvm.org> wrote: >> >> Hi, all, >> >> I am planning to add clang-tidy checkers for my company. How to add a new module for my company? Please help, thanks in advance. >> >> I try to copy files from cert module, and rename cert to Misra, then add a rule named "m-0-1-1" by ./add_new_checker.py. >> >> then I run ninja check-clang-tool, but my case is failed due to below error >> >> Running ['clang-tidy', '/Users/zyg/Documents/workspace/llvm-project/llvm/cmake-build-debug/tools/clang/tools/extra/test/clang-tidy/checkers/Output/misra-m-0-1-1.cpp.tmp.cpp', '-fix', '--checks=-*,misra-m-0-1-1', '-format-style=none', '--', '-std=c++11', '-nostdinc++']... clang-tidy failed: Error: no checks enabled. USAGE: clang-tidy [options] <source0> [... <sourceN>] >> >> >> >> Below is my diff >> >> >> diff --git a/clang-tools-extra/clang-tidy/CMakeLists.txt b/clang-tools-extra/clang-tidy/CMakeLists.txt >> index ca7a5afed6b..ccb77ef6a62 100644 >> --- a/clang-tools-extra/clang-tidy/CMakeLists.txt >> +++ b/clang-tools-extra/clang-tidy/CMakeLists.txt >> @@ -64,6 +64,7 @@ add_subdirectory(linuxkernel) >> add_subdirectory(llvm) >> add_subdirectory(llvmlibc) >> add_subdirectory(misc) >> +add_subdirectory(misra) >> add_subdirectory(modernize) >> if(CLANG_TIDY_ENABLE_STATIC_ANALYZER) >> add_subdirectory(mpi) >> @@ -90,6 +91,7 @@ set(ALL_CLANG_TIDY_CHECKS >> clangTidyLLVMModule >> clangTidyLLVMLibcModule >> clangTidyMiscModule >> + clangTidyMISRAModule >> clangTidyModernizeModule >> clangTidyObjCModule >> clangTidyOpenMPModule >> diff --git a/clang-tools-extra/clang-tidy/misra/CMakeLists.txt b/clang-tools-extra/clang-tidy/misra/CMakeLists.txt >> new file mode 100644 >> index 00000000000..ca345a946c9 >> --- /dev/null >> +++ b/clang-tools-extra/clang-tidy/misra/CMakeLists.txt >> @@ -0,0 +1,28 @@ >> +set(LLVM_LINK_COMPONENTS >> + support >> + FrontendOpenMP >> + ) >> + >> +add_clang_library(clangTidyMISRAModule >> + M011Check.cpp >> + MISRATidyModule.cpp >> + LINK_LIBS >> + clangTidy >> + clangTidyBugproneModule >> + clangTidyGoogleModule >> + clangTidyMiscModule >> + clangTidyPerformanceModule >> + clangTidyReadabilityModule >> + clangTidyUtils >> + >> + DEPENDS >> + omp_gen >> +) >> + >> +clang_target_link_libraries(clangTidyMISRAModule >> + PRIVATE >> + clangAST >> + clangASTMatchers >> + clangBasic >> + clangLex >> + ) >> diff --git a/clang-tools-extra/clang-tidy/misra/M011Check.cpp b/clang-tools-extra/clang-tidy/misra/M011Check.cpp >> new file mode 100644 >> index 00000000000..ebc0ba3bbe0 >> --- /dev/null >> +++ b/clang-tools-extra/clang-tidy/misra/M011Check.cpp >> @@ -0,0 +1,37 @@ >> +//===--- M011Check.cpp - clang-tidy ---------------------------------------===// >> +// >> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. >> +// See https://llvm.org/LICENSE.txt for license information. >> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception >> +// >> +//===----------------------------------------------------------------------===// >> + >> +#include "M011Check.h" >> +#include "clang/AST/ASTContext.h" >> +#include "clang/ASTMatchers/ASTMatchFinder.h" >> + >> +using namespace clang::ast_matchers; >> + >> +namespace clang { >> +namespace tidy { >> +namespace misra { >> + >> +void M011Check::registerMatchers(MatchFinder *Finder) { >> + // FIXME: Add matchers. >> + Finder->addMatcher(functionDecl().bind("x"), this); >> +} >> + >> +void M011Check::check(const MatchFinder::MatchResult &Result) { >> + // FIXME: Add callback implementation. >> + const auto *MatchedDecl = Result.Nodes.getNodeAs<FunctionDecl>("x"); >> + if (!MatchedDecl->getIdentifier() || MatchedDecl->getName().startswith("awesome_")) >> + return; >> + diag(MatchedDecl->getLocation(), "function %0 is insufficiently awesome") >> + << MatchedDecl; >> + diag(MatchedDecl->getLocation(), "insert 'awesome'", DiagnosticIDs::Note) >> + << FixItHint::CreateInsertion(MatchedDecl->getLocation(), "awesome_"); >> +} >> + >> +} // namespace misra >> +} // namespace tidy >> +} // namespace clang >> diff --git a/clang-tools-extra/clang-tidy/misra/M011Check.h b/clang-tools-extra/clang-tidy/misra/M011Check.h >> new file mode 100644 >> index 00000000000..289d54545c7 >> --- /dev/null >> +++ b/clang-tools-extra/clang-tidy/misra/M011Check.h >> @@ -0,0 +1,34 @@ >> +//===--- M011Check.h - clang-tidy -------------------------------*- C++ -*-===// >> +// >> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. >> +// See https://llvm.org/LICENSE.txt for license information. >> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception >> +// >> +//===----------------------------------------------------------------------===// >> + >> +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H >> +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H >> + >> +#include "../ClangTidyCheck.h" >> + >> +namespace clang { >> +namespace tidy { >> +namespace misra { >> + >> +/// FIXME: Write a short description. >> +/// >> +/// For the user-facing documentation see: >> +/// http://clang.llvm.org/extra/clang-tidy/checks/misra-m-0-1-1.html >> +class M011Check : public ClangTidyCheck { >> +public: >> + M011Check(StringRef Name, ClangTidyContext *Context) >> + : ClangTidyCheck(Name, Context) {} >> + void registerMatchers(ast_matchers::MatchFinder *Finder) override; >> + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; >> +}; >> + >> +} // namespace misra >> +} // namespace tidy >> +} // namespace clang >> + >> +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H >> diff --git a/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp b/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp >> new file mode 100644 >> index 00000000000..cb78fa7efe0 >> --- /dev/null >> +++ b/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp >> @@ -0,0 +1,46 @@ >> +//===--- CERTTidyModule.cpp - clang-tidy ----------------------------------===// >> +// >> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. >> +// See https://llvm.org/LICENSE.txt for license information. >> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception >> +// >> +//===----------------------------------------------------------------------===// >> + >> +#include "../ClangTidy.h" >> +#include "../ClangTidyModule.h" >> +#include "../ClangTidyModuleRegistry.h" >> +#include "M011Check.h" >> + >> + >> +namespace clang { >> +namespace tidy { >> +namespace misra { >> + >> +class MISRAModule : public ClangTidyModule { >> +public: >> + void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { >> + // C++ checkers >> + >> + CheckFactories.registerCheck<M011Check>( >> + "misra-m-0-1-1"); >> + } >> + >> + ClangTidyOptions getModuleOptions() override { >> + ClangTidyOptions Options; >> + return Options; >> + } >> +}; >> + >> +} // namespace misra >> + >> +// Register the MiscTidyModule using this statically initialized variable. >> +static ClangTidyModuleRegistry::Add<misra::MISRAModule> >> + X("misra-module", >> + "Adds lint checks corresponding to CERT secure coding guidelines."); >> + >> +// This anchor is used to force the linker to link in the generated object file >> +// and thus register the CERTModule. >> +volatile int MISRAModuleAnchorSource = 0; >> + >> +} // namespace tidy >> +} // namespace clang >> diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst >> index 62bfd314920..144bd80eaab 100644 >> --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst >> +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst >> @@ -213,6 +213,7 @@ Clang-Tidy Checks >> `misc-unused-alias-decls <misc-unused-alias-decls.html>`_, "Yes" >> `misc-unused-parameters <misc-unused-parameters.html>`_, "Yes" >> `misc-unused-using-decls <misc-unused-using-decls.html>`_, "Yes" >> + `misra-m-0-1-1 <misra-m-0-1-1.html>`_, "Yes" >> `modernize-avoid-bind <modernize-avoid-bind.html>`_, "Yes" >> `modernize-avoid-c-arrays <modernize-avoid-c-arrays.html>`_, >> `modernize-concat-nested-namespaces <modernize-concat-nested-namespaces.html>`_, "Yes" >> diff --git a/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst b/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst >> new file mode 100644 >> index 00000000000..7fd1cefbca8 >> --- /dev/null >> +++ b/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst >> @@ -0,0 +1,6 @@ >> +.. title:: clang-tidy - misra-m-0-1-1 >> + >> +misra-m-0-1-1 >> +============>> + >> +FIXME: Describe what patterns does the check detect and why. Give examples. >> diff --git a/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp b/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp >> new file mode 100644 >> index 00000000000..382524ac36b >> --- /dev/null >> +++ b/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp >> @@ -0,0 +1,14 @@ >> +// RUN: %check_clang_tidy %s misra-m-0-1-1 %t >> + >> +// FIXME: Add something that triggers the check here. >> +void f(); >> +// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'f' is insufficiently awesome [misra-m-0-1-1] >> + >> +// FIXME: Verify the applied fix. >> +// * Make the CHECK patterns specific enough and try to make verified lines >> +// unique to avoid incorrect matches. >> +// * Use {{}} for regular expressions. >> +// CHECK-FIXES: {{^}}void awesome_f();{{$}} >> + >> +// FIXME: Add something that doesn't trigger the check here. >> +void awesome_f2(); >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200927/9841e9e6/attachment-0001.html> -------------- next part -------------- A non-text attachment was scrubbed... Name: PastedGraphic-1.png Type: image/png Size: 122324 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200927/9841e9e6/attachment-0001.png>
zhaoyonggang via llvm-dev
2020-Sep-27 09:16 UTC
[llvm-dev] How to add a new clang-tidy module
Hi, Roman, Thanks a lot, I have resolved this issue. diff --git a/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h b/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h index 3a5330c85c3..d9a5b486d6e 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h +++ b/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h @@ -90,6 +90,11 @@ extern volatile int MiscModuleAnchorSource; static int LLVM_ATTRIBUTE_UNUSED MiscModuleAnchorDestination MiscModuleAnchorSource; +// This anchor is used to force the linker to link the MISRAModule. +extern volatile int MISRAModuleAnchorSource; +static int LLVM_ATTRIBUTE_UNUSED MISRAModuleAnchorDestination + MISRAModuleAnchorSource; + // This anchor is used to force the linker to link the ModernizeModule. extern volatile int ModernizeModuleAnchorSource; static int LLVM_ATTRIBUTE_UNUSED ModernizeModuleAnchorDestination> On Sep 27, 2020, at 4:57 PM, Roman Lebedev <lebedev.ri at gmail.com> wrote: > > See https://reviews.llvm.org/D36836 for modern example of minimal scaffolding. > > Roman > > On Sun, Sep 27, 2020 at 11:39 AM zhaoyonggang via llvm-dev > <llvm-dev at lists.llvm.org> wrote: >> >> Hi, all, >> >> I am planning to add clang-tidy checkers for my company. How to add a new module for my company? Please help, thanks in advance. >> >> I try to copy files from cert module, and rename cert to Misra, then add a rule named "m-0-1-1" by ./add_new_checker.py. >> >> then I run ninja check-clang-tool, but my case is failed due to below error >> >> Running ['clang-tidy', '/Users/zyg/Documents/workspace/llvm-project/llvm/cmake-build-debug/tools/clang/tools/extra/test/clang-tidy/checkers/Output/misra-m-0-1-1.cpp.tmp.cpp', '-fix', '--checks=-*,misra-m-0-1-1', '-format-style=none', '--', '-std=c++11', '-nostdinc++']... clang-tidy failed: Error: no checks enabled. USAGE: clang-tidy [options] <source0> [... <sourceN>] >> >> >> >> Below is my diff >> >> >> diff --git a/clang-tools-extra/clang-tidy/CMakeLists.txt b/clang-tools-extra/clang-tidy/CMakeLists.txt >> index ca7a5afed6b..ccb77ef6a62 100644 >> --- a/clang-tools-extra/clang-tidy/CMakeLists.txt >> +++ b/clang-tools-extra/clang-tidy/CMakeLists.txt >> @@ -64,6 +64,7 @@ add_subdirectory(linuxkernel) >> add_subdirectory(llvm) >> add_subdirectory(llvmlibc) >> add_subdirectory(misc) >> +add_subdirectory(misra) >> add_subdirectory(modernize) >> if(CLANG_TIDY_ENABLE_STATIC_ANALYZER) >> add_subdirectory(mpi) >> @@ -90,6 +91,7 @@ set(ALL_CLANG_TIDY_CHECKS >> clangTidyLLVMModule >> clangTidyLLVMLibcModule >> clangTidyMiscModule >> + clangTidyMISRAModule >> clangTidyModernizeModule >> clangTidyObjCModule >> clangTidyOpenMPModule >> diff --git a/clang-tools-extra/clang-tidy/misra/CMakeLists.txt b/clang-tools-extra/clang-tidy/misra/CMakeLists.txt >> new file mode 100644 >> index 00000000000..ca345a946c9 >> --- /dev/null >> +++ b/clang-tools-extra/clang-tidy/misra/CMakeLists.txt >> @@ -0,0 +1,28 @@ >> +set(LLVM_LINK_COMPONENTS >> + support >> + FrontendOpenMP >> + ) >> + >> +add_clang_library(clangTidyMISRAModule >> + M011Check.cpp >> + MISRATidyModule.cpp >> + LINK_LIBS >> + clangTidy >> + clangTidyBugproneModule >> + clangTidyGoogleModule >> + clangTidyMiscModule >> + clangTidyPerformanceModule >> + clangTidyReadabilityModule >> + clangTidyUtils >> + >> + DEPENDS >> + omp_gen >> +) >> + >> +clang_target_link_libraries(clangTidyMISRAModule >> + PRIVATE >> + clangAST >> + clangASTMatchers >> + clangBasic >> + clangLex >> + ) >> diff --git a/clang-tools-extra/clang-tidy/misra/M011Check.cpp b/clang-tools-extra/clang-tidy/misra/M011Check.cpp >> new file mode 100644 >> index 00000000000..ebc0ba3bbe0 >> --- /dev/null >> +++ b/clang-tools-extra/clang-tidy/misra/M011Check.cpp >> @@ -0,0 +1,37 @@ >> +//===--- M011Check.cpp - clang-tidy ---------------------------------------===// >> +// >> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. >> +// See https://llvm.org/LICENSE.txt for license information. >> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception >> +// >> +//===----------------------------------------------------------------------===// >> + >> +#include "M011Check.h" >> +#include "clang/AST/ASTContext.h" >> +#include "clang/ASTMatchers/ASTMatchFinder.h" >> + >> +using namespace clang::ast_matchers; >> + >> +namespace clang { >> +namespace tidy { >> +namespace misra { >> + >> +void M011Check::registerMatchers(MatchFinder *Finder) { >> + // FIXME: Add matchers. >> + Finder->addMatcher(functionDecl().bind("x"), this); >> +} >> + >> +void M011Check::check(const MatchFinder::MatchResult &Result) { >> + // FIXME: Add callback implementation. >> + const auto *MatchedDecl = Result.Nodes.getNodeAs<FunctionDecl>("x"); >> + if (!MatchedDecl->getIdentifier() || MatchedDecl->getName().startswith("awesome_")) >> + return; >> + diag(MatchedDecl->getLocation(), "function %0 is insufficiently awesome") >> + << MatchedDecl; >> + diag(MatchedDecl->getLocation(), "insert 'awesome'", DiagnosticIDs::Note) >> + << FixItHint::CreateInsertion(MatchedDecl->getLocation(), "awesome_"); >> +} >> + >> +} // namespace misra >> +} // namespace tidy >> +} // namespace clang >> diff --git a/clang-tools-extra/clang-tidy/misra/M011Check.h b/clang-tools-extra/clang-tidy/misra/M011Check.h >> new file mode 100644 >> index 00000000000..289d54545c7 >> --- /dev/null >> +++ b/clang-tools-extra/clang-tidy/misra/M011Check.h >> @@ -0,0 +1,34 @@ >> +//===--- M011Check.h - clang-tidy -------------------------------*- C++ -*-===// >> +// >> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. >> +// See https://llvm.org/LICENSE.txt for license information. >> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception >> +// >> +//===----------------------------------------------------------------------===// >> + >> +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H >> +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H >> + >> +#include "../ClangTidyCheck.h" >> + >> +namespace clang { >> +namespace tidy { >> +namespace misra { >> + >> +/// FIXME: Write a short description. >> +/// >> +/// For the user-facing documentation see: >> +/// http://clang.llvm.org/extra/clang-tidy/checks/misra-m-0-1-1.html >> +class M011Check : public ClangTidyCheck { >> +public: >> + M011Check(StringRef Name, ClangTidyContext *Context) >> + : ClangTidyCheck(Name, Context) {} >> + void registerMatchers(ast_matchers::MatchFinder *Finder) override; >> + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; >> +}; >> + >> +} // namespace misra >> +} // namespace tidy >> +} // namespace clang >> + >> +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H >> diff --git a/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp b/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp >> new file mode 100644 >> index 00000000000..cb78fa7efe0 >> --- /dev/null >> +++ b/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp >> @@ -0,0 +1,46 @@ >> +//===--- CERTTidyModule.cpp - clang-tidy ----------------------------------===// >> +// >> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. >> +// See https://llvm.org/LICENSE.txt for license information. >> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception >> +// >> +//===----------------------------------------------------------------------===// >> + >> +#include "../ClangTidy.h" >> +#include "../ClangTidyModule.h" >> +#include "../ClangTidyModuleRegistry.h" >> +#include "M011Check.h" >> + >> + >> +namespace clang { >> +namespace tidy { >> +namespace misra { >> + >> +class MISRAModule : public ClangTidyModule { >> +public: >> + void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { >> + // C++ checkers >> + >> + CheckFactories.registerCheck<M011Check>( >> + "misra-m-0-1-1"); >> + } >> + >> + ClangTidyOptions getModuleOptions() override { >> + ClangTidyOptions Options; >> + return Options; >> + } >> +}; >> + >> +} // namespace misra >> + >> +// Register the MiscTidyModule using this statically initialized variable. >> +static ClangTidyModuleRegistry::Add<misra::MISRAModule> >> + X("misra-module", >> + "Adds lint checks corresponding to CERT secure coding guidelines."); >> + >> +// This anchor is used to force the linker to link in the generated object file >> +// and thus register the CERTModule. >> +volatile int MISRAModuleAnchorSource = 0; >> + >> +} // namespace tidy >> +} // namespace clang >> diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst >> index 62bfd314920..144bd80eaab 100644 >> --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst >> +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst >> @@ -213,6 +213,7 @@ Clang-Tidy Checks >> `misc-unused-alias-decls <misc-unused-alias-decls.html>`_, "Yes" >> `misc-unused-parameters <misc-unused-parameters.html>`_, "Yes" >> `misc-unused-using-decls <misc-unused-using-decls.html>`_, "Yes" >> + `misra-m-0-1-1 <misra-m-0-1-1.html>`_, "Yes" >> `modernize-avoid-bind <modernize-avoid-bind.html>`_, "Yes" >> `modernize-avoid-c-arrays <modernize-avoid-c-arrays.html>`_, >> `modernize-concat-nested-namespaces <modernize-concat-nested-namespaces.html>`_, "Yes" >> diff --git a/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst b/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst >> new file mode 100644 >> index 00000000000..7fd1cefbca8 >> --- /dev/null >> +++ b/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst >> @@ -0,0 +1,6 @@ >> +.. title:: clang-tidy - misra-m-0-1-1 >> + >> +misra-m-0-1-1 >> +============>> + >> +FIXME: Describe what patterns does the check detect and why. Give examples. >> diff --git a/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp b/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp >> new file mode 100644 >> index 00000000000..382524ac36b >> --- /dev/null >> +++ b/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp >> @@ -0,0 +1,14 @@ >> +// RUN: %check_clang_tidy %s misra-m-0-1-1 %t >> + >> +// FIXME: Add something that triggers the check here. >> +void f(); >> +// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'f' is insufficiently awesome [misra-m-0-1-1] >> + >> +// FIXME: Verify the applied fix. >> +// * Make the CHECK patterns specific enough and try to make verified lines >> +// unique to avoid incorrect matches. >> +// * Use {{}} for regular expressions. >> +// CHECK-FIXES: {{^}}void awesome_f();{{$}} >> + >> +// FIXME: Add something that doesn't trigger the check here. >> +void awesome_f2(); >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Reasonably Related Threads
- configure problem --- Can't find recent OpenSSL libcrypto
- [RFC][PATCH] ovirt-node-image : edit-livecd : fail on error in arbitrary code
- Finishing up the contributors list as well
- puppet master REST API returns 403 when running under passenger works when running from command line
- Creating a clang-tidy const position check