<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi, Roman,<div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">    </span>Thanks a lot, root cause should be like below. I am not familiar with this linker magic, :(</div><div class=""><br class=""></div><div class=""><img apple-inline="yes" id="AE60A66E-A850-405F-BE31-EF20432B9085" width="1558" height="157" src="cid:9F655308-B4D2-4026-912A-3CFFDC3FC919" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Sep 27, 2020, at 4:57 PM, Roman Lebedev <<a href="mailto:lebedev.ri@gmail.com" class="">lebedev.ri@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">See <a href="https://reviews.llvm.org/D36836" class="">https://reviews.llvm.org/D36836</a> for modern example of minimal scaffolding.<br class=""><br class="">Roman<br class=""><br class="">On Sun, Sep 27, 2020 at 11:39 AM zhaoyonggang via llvm-dev<br class=""><<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:<br class=""><blockquote type="cite" class=""><br class="">Hi, all,<br class=""><br class="">        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.<br class=""><br class="">        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.<br class=""><br class="">        then I run ninja check-clang-tool, but my case is failed due to below error<br class=""><br class="">        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>]<br class=""><br class=""><br class=""><br class="">Below is my diff<br class=""><br class=""><br class="">diff --git a/clang-tools-extra/clang-tidy/CMakeLists.txt b/clang-tools-extra/clang-tidy/CMakeLists.txt<br class="">index ca7a5afed6b..ccb77ef6a62 100644<br class="">--- a/clang-tools-extra/clang-tidy/CMakeLists.txt<br class="">+++ b/clang-tools-extra/clang-tidy/CMakeLists.txt<br class="">@@ -64,6 +64,7 @@ add_subdirectory(linuxkernel)<br class=""> add_subdirectory(llvm)<br class=""> add_subdirectory(llvmlibc)<br class=""> add_subdirectory(misc)<br class="">+add_subdirectory(misra)<br class=""> add_subdirectory(modernize)<br class=""> if(CLANG_TIDY_ENABLE_STATIC_ANALYZER)<br class="">   add_subdirectory(mpi)<br class="">@@ -90,6 +91,7 @@ set(ALL_CLANG_TIDY_CHECKS<br class="">   clangTidyLLVMModule<br class="">   clangTidyLLVMLibcModule<br class="">   clangTidyMiscModule<br class="">+  clangTidyMISRAModule<br class="">   clangTidyModernizeModule<br class="">   clangTidyObjCModule<br class="">   clangTidyOpenMPModule<br class="">diff --git a/clang-tools-extra/clang-tidy/misra/CMakeLists.txt b/clang-tools-extra/clang-tidy/misra/CMakeLists.txt<br class="">new file mode 100644<br class="">index 00000000000..ca345a946c9<br class="">--- /dev/null<br class="">+++ b/clang-tools-extra/clang-tidy/misra/CMakeLists.txt<br class="">@@ -0,0 +1,28 @@<br class="">+set(LLVM_LINK_COMPONENTS<br class="">+  support<br class="">+  FrontendOpenMP<br class="">+  )<br class="">+<br class="">+add_clang_library(clangTidyMISRAModule<br class="">+  M011Check.cpp<br class="">+  MISRATidyModule.cpp<br class="">+  LINK_LIBS<br class="">+  clangTidy<br class="">+  clangTidyBugproneModule<br class="">+  clangTidyGoogleModule<br class="">+  clangTidyMiscModule<br class="">+  clangTidyPerformanceModule<br class="">+  clangTidyReadabilityModule<br class="">+  clangTidyUtils<br class="">+<br class="">+  DEPENDS<br class="">+  omp_gen<br class="">+)<br class="">+<br class="">+clang_target_link_libraries(clangTidyMISRAModule<br class="">+  PRIVATE<br class="">+  clangAST<br class="">+  clangASTMatchers<br class="">+  clangBasic<br class="">+  clangLex<br class="">+  )<br class="">diff --git a/clang-tools-extra/clang-tidy/misra/M011Check.cpp b/clang-tools-extra/clang-tidy/misra/M011Check.cpp<br class="">new file mode 100644<br class="">index 00000000000..ebc0ba3bbe0<br class="">--- /dev/null<br class="">+++ b/clang-tools-extra/clang-tidy/misra/M011Check.cpp<br class="">@@ -0,0 +1,37 @@<br class="">+//===--- M011Check.cpp - clang-tidy ---------------------------------------===//<br class="">+//<br class="">+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.<br class="">+// See <a href="https://llvm.org/LICENSE.txt" class="">https://llvm.org/LICENSE.txt</a> for license information.<br class="">+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception<br class="">+//<br class="">+//===----------------------------------------------------------------------===//<br class="">+<br class="">+#include "M011Check.h"<br class="">+#include "clang/AST/ASTContext.h"<br class="">+#include "clang/ASTMatchers/ASTMatchFinder.h"<br class="">+<br class="">+using namespace clang::ast_matchers;<br class="">+<br class="">+namespace clang {<br class="">+namespace tidy {<br class="">+namespace misra {<br class="">+<br class="">+void M011Check::registerMatchers(MatchFinder *Finder) {<br class="">+  // FIXME: Add matchers.<br class="">+  Finder->addMatcher(functionDecl().bind("x"), this);<br class="">+}<br class="">+<br class="">+void M011Check::check(const MatchFinder::MatchResult &Result) {<br class="">+  // FIXME: Add callback implementation.<br class="">+  const auto *MatchedDecl = Result.Nodes.getNodeAs<FunctionDecl>("x");<br class="">+  if (!MatchedDecl->getIdentifier() || MatchedDecl->getName().startswith("awesome_"))<br class="">+    return;<br class="">+  diag(MatchedDecl->getLocation(), "function %0 is insufficiently awesome")<br class="">+      << MatchedDecl;<br class="">+  diag(MatchedDecl->getLocation(), "insert 'awesome'", DiagnosticIDs::Note)<br class="">+      << FixItHint::CreateInsertion(MatchedDecl->getLocation(), "awesome_");<br class="">+}<br class="">+<br class="">+} // namespace misra<br class="">+} // namespace tidy<br class="">+} // namespace clang<br class="">diff --git a/clang-tools-extra/clang-tidy/misra/M011Check.h b/clang-tools-extra/clang-tidy/misra/M011Check.h<br class="">new file mode 100644<br class="">index 00000000000..289d54545c7<br class="">--- /dev/null<br class="">+++ b/clang-tools-extra/clang-tidy/misra/M011Check.h<br class="">@@ -0,0 +1,34 @@<br class="">+//===--- M011Check.h - clang-tidy -------------------------------*- C++ -*-===//<br class="">+//<br class="">+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.<br class="">+// See <a href="https://llvm.org/LICENSE.txt" class="">https://llvm.org/LICENSE.txt</a> for license information.<br class="">+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception<br class="">+//<br class="">+//===----------------------------------------------------------------------===//<br class="">+<br class="">+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H<br class="">+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H<br class="">+<br class="">+#include "../ClangTidyCheck.h"<br class="">+<br class="">+namespace clang {<br class="">+namespace tidy {<br class="">+namespace misra {<br class="">+<br class="">+/// FIXME: Write a short description.<br class="">+///<br class="">+/// For the user-facing documentation see:<br class="">+/// <a href="http://clang.llvm.org/extra/clang-tidy/checks/misra-m-0-1-1.html" class="">http://clang.llvm.org/extra/clang-tidy/checks/misra-m-0-1-1.html</a><br class="">+class M011Check : public ClangTidyCheck {<br class="">+public:<br class="">+  M011Check(StringRef Name, ClangTidyContext *Context)<br class="">+      : ClangTidyCheck(Name, Context) {}<br class="">+  void registerMatchers(ast_matchers::MatchFinder *Finder) override;<br class="">+  void check(const ast_matchers::MatchFinder::MatchResult &Result) override;<br class="">+};<br class="">+<br class="">+} // namespace misra<br class="">+} // namespace tidy<br class="">+} // namespace clang<br class="">+<br class="">+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISRA_M011CHECK_H<br class="">diff --git a/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp b/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp<br class="">new file mode 100644<br class="">index 00000000000..cb78fa7efe0<br class="">--- /dev/null<br class="">+++ b/clang-tools-extra/clang-tidy/misra/MISRATidyModule.cpp<br class="">@@ -0,0 +1,46 @@<br class="">+//===--- CERTTidyModule.cpp - clang-tidy ----------------------------------===//<br class="">+//<br class="">+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.<br class="">+// See <a href="https://llvm.org/LICENSE.txt" class="">https://llvm.org/LICENSE.txt</a> for license information.<br class="">+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception<br class="">+//<br class="">+//===----------------------------------------------------------------------===//<br class="">+<br class="">+#include "../ClangTidy.h"<br class="">+#include "../ClangTidyModule.h"<br class="">+#include "../ClangTidyModuleRegistry.h"<br class="">+#include "M011Check.h"<br class="">+<br class="">+<br class="">+namespace clang {<br class="">+namespace tidy {<br class="">+namespace misra {<br class="">+<br class="">+class MISRAModule : public ClangTidyModule {<br class="">+public:<br class="">+  void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {<br class="">+    // C++ checkers<br class="">+<br class="">+    CheckFactories.registerCheck<M011Check>(<br class="">+        "misra-m-0-1-1");<br class="">+  }<br class="">+<br class="">+  ClangTidyOptions getModuleOptions() override {<br class="">+    ClangTidyOptions Options;<br class="">+    return Options;<br class="">+  }<br class="">+};<br class="">+<br class="">+} // namespace misra<br class="">+<br class="">+// Register the MiscTidyModule using this statically initialized variable.<br class="">+static ClangTidyModuleRegistry::Add<misra::MISRAModule><br class="">+    X("misra-module",<br class="">+      "Adds lint checks corresponding to CERT secure coding guidelines.");<br class="">+<br class="">+// This anchor is used to force the linker to link in the generated object file<br class="">+// and thus register the CERTModule.<br class="">+volatile int MISRAModuleAnchorSource = 0;<br class="">+<br class="">+} // namespace tidy<br class="">+} // namespace clang<br class="">diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst<br class="">index 62bfd314920..144bd80eaab 100644<br class="">--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst<br class="">+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst<br class="">@@ -213,6 +213,7 @@ Clang-Tidy Checks<br class="">    `misc-unused-alias-decls <misc-unused-alias-decls.html>`_, "Yes"<br class="">    `misc-unused-parameters <misc-unused-parameters.html>`_, "Yes"<br class="">    `misc-unused-using-decls <misc-unused-using-decls.html>`_, "Yes"<br class="">+   `misra-m-0-1-1 <misra-m-0-1-1.html>`_, "Yes"<br class="">    `modernize-avoid-bind <modernize-avoid-bind.html>`_, "Yes"<br class="">    `modernize-avoid-c-arrays <modernize-avoid-c-arrays.html>`_,<br class="">    `modernize-concat-nested-namespaces <modernize-concat-nested-namespaces.html>`_, "Yes"<br class="">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<br class="">new file mode 100644<br class="">index 00000000000..7fd1cefbca8<br class="">--- /dev/null<br class="">+++ b/clang-tools-extra/docs/clang-tidy/checks/misra-m-0-1-1.rst<br class="">@@ -0,0 +1,6 @@<br class="">+.. title:: clang-tidy - misra-m-0-1-1<br class="">+<br class="">+misra-m-0-1-1<br class="">+=============<br class="">+<br class="">+FIXME: Describe what patterns does the check detect and why. Give examples.<br class="">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<br class="">new file mode 100644<br class="">index 00000000000..382524ac36b<br class="">--- /dev/null<br class="">+++ b/clang-tools-extra/test/clang-tidy/checkers/misra-m-0-1-1.cpp<br class="">@@ -0,0 +1,14 @@<br class="">+// RUN: %check_clang_tidy %s misra-m-0-1-1 %t<br class="">+<br class="">+// FIXME: Add something that triggers the check here.<br class="">+void f();<br class="">+// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'f' is insufficiently awesome [misra-m-0-1-1]<br class="">+<br class="">+// FIXME: Verify the applied fix.<br class="">+//   * Make the CHECK patterns specific enough and try to make verified lines<br class="">+//     unique to avoid incorrect matches.<br class="">+//   * Use {{}} for regular expressions.<br class="">+// CHECK-FIXES: {{^}}void awesome_f();{{$}}<br class="">+<br class="">+// FIXME: Add something that doesn't trigger the check here.<br class="">+void awesome_f2();<br class="">_______________________________________________<br class="">LLVM Developers mailing list<br class=""><a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev<br class=""></blockquote></div></div></blockquote></div><br class=""></div></body></html>