[PATCH] D26310: Add a method to get the list of registered static analyzer checkers.

Alexander Kornienko via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 4 14:26:29 PDT 2016


alexfh created this revision.
alexfh added a reviewer: zaks.anna.
alexfh added a subscriber: cfe-commits.

This provides a better interface for clang-tidy and encapsulates the knowledge
about experimental checkers instead of leaving this to the clients.


https://reviews.llvm.org/D26310

Files:
  include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
  lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
  unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp


Index: unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
===================================================================
--- unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
+++ unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
@@ -14,6 +14,23 @@
 namespace clang {
 namespace ento {
 
+TEST(StaticAnalyzerOptions, getRegisteredCheckers) {
+  auto IsDebugChecker = [](StringRef CheckerName) {
+    return CheckerName.startswith("debug");
+  };
+  auto IsAlphaChecker = [](StringRef CheckerName) {
+    return CheckerName.startswith("alpha");
+  };
+  const auto &AllCheckers =
+      AnalyzerOptions::getRegisteredCheckers(/*IncludeExperimental=*/true);
+  EXPECT_TRUE(llvm::any_of(AllCheckers, IsDebugChecker));
+  EXPECT_TRUE(llvm::any_of(AllCheckers, IsAlphaChecker));
+
+  const auto &StableCheckers = AnalyzerOptions::getRegisteredCheckers();
+  EXPECT_FALSE(llvm::any_of(StableCheckers, IsDebugChecker));
+  EXPECT_FALSE(llvm::any_of(StableCheckers, IsAlphaChecker));
+}
+
 TEST(StaticAnalyzerOptions, SearchInParentPackageTests) {
   AnalyzerOptions Opts;
   Opts.Config["Outer.Inner.CheckerOne:Option"] = "true";
Index: lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
===================================================================
--- lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
+++ lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
@@ -23,6 +23,25 @@
 using namespace ento;
 using namespace llvm;
 
+std::vector<StringRef>
+AnalyzerOptions::getRegisteredCheckers(bool IncludeExperimental /* = false */) {
+  static const StringRef StaticAnalyzerChecks[] = {
+#define GET_CHECKERS
+#define CHECKER(FULLNAME, CLASS, DESCFILE, HELPTEXT, GROUPINDEX, HIDDEN)       \
+  FULLNAME,
+#include "clang/StaticAnalyzer/Checkers/Checkers.inc"
+#undef CHECKER
+#undef GET_CHECKERS
+  };
+  std::vector<StringRef> Result;
+  for (StringRef CheckName : StaticAnalyzerChecks) {
+    if (IncludeExperimental ||
+        (!CheckName.startswith("debug.") && !CheckName.startswith("alpha.")))
+      Result.push_back(CheckName);
+  }
+  return Result;
+}
+
 AnalyzerOptions::UserModeKind AnalyzerOptions::getUserMode() {
   if (UserMode == UMK_NotSet) {
     StringRef ModeStr =
Index: include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
===================================================================
--- include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
+++ include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
@@ -125,6 +125,9 @@
 public:
   typedef llvm::StringMap<std::string> ConfigTable;
 
+  static std::vector<StringRef>
+  getRegisteredCheckers(bool IncludeExperimental = false);
+
   /// \brief Pair of checker name and enable/disable.
   std::vector<std::pair<std::string, bool> > CheckersControlList;
   


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26310.76944.patch
Type: text/x-patch
Size: 2708 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161104/aaf953d2/attachment.bin>


More information about the cfe-commits mailing list