Index: include/clang/StaticAnalyzer/Core/AnalyzerOptions.h =================================================================== --- include/clang/StaticAnalyzer/Core/AnalyzerOptions.h +++ include/clang/StaticAnalyzer/Core/AnalyzerOptions.h @@ -126,7 +126,8 @@ using ConfigTable = llvm::StringMap; static std::vector - getRegisteredCheckers(bool IncludeExperimental = false); + getRegisteredCheckers(bool IncludeExperimental = false, + bool IncludeDebug = false); /// \brief Pair of checker name and enable/disable. std::vector> CheckersControlList; Index: lib/StaticAnalyzer/Core/AnalyzerOptions.cpp =================================================================== --- lib/StaticAnalyzer/Core/AnalyzerOptions.cpp +++ lib/StaticAnalyzer/Core/AnalyzerOptions.cpp @@ -31,7 +31,8 @@ using namespace llvm; std::vector -AnalyzerOptions::getRegisteredCheckers(bool IncludeExperimental /* = false */) { +AnalyzerOptions::getRegisteredCheckers(bool IncludeExperimental /* = false */, + bool IncludeDebug /* = false */) { static const StringRef StaticAnalyzerChecks[] = { #define GET_CHECKERS #define CHECKER(FULLNAME, CLASS, DESCFILE, HELPTEXT, GROUPINDEX, HIDDEN) \ @@ -42,9 +43,10 @@ }; std::vector Result; for (StringRef CheckName : StaticAnalyzerChecks) { - if (!CheckName.startswith("debug.") && - (IncludeExperimental || !CheckName.startswith("alpha."))) - Result.push_back(CheckName); + if ((CheckName.startswith("alpha.") && !IncludeExperimental) || + (CheckName.startswith("debug.") && !IncludeDebug)) + continue; + Result.push_back(CheckName); } return Result; } Index: unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp =================================================================== --- unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp +++ unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp @@ -21,12 +21,18 @@ auto IsAlphaChecker = [](StringRef CheckerName) { return CheckerName.startswith("alpha"); }; - const auto &AllCheckers = - AnalyzerOptions::getRegisteredCheckers(/*IncludeExperimental=*/true); - EXPECT_FALSE(llvm::any_of(AllCheckers, IsDebugChecker)); + const auto &AllCheckers = AnalyzerOptions::getRegisteredCheckers( + /*IncludeExperimental=*/true, /*IncludeDebug=*/true); + EXPECT_TRUE(llvm::any_of(AllCheckers, IsDebugChecker)); EXPECT_TRUE(llvm::any_of(AllCheckers, IsAlphaChecker)); - const auto &StableCheckers = AnalyzerOptions::getRegisteredCheckers(); + const auto &AllNonDebugCheckers = AnalyzerOptions::getRegisteredCheckers( + /*IncludeExperimental=*/true, /*IncludeDebug=*/false); + EXPECT_FALSE(llvm::any_of(AllNonDebugCheckers, IsDebugChecker)); + EXPECT_TRUE(llvm::any_of(AllNonDebugCheckers, IsAlphaChecker)); + + const auto &StableCheckers = AnalyzerOptions::getRegisteredCheckers( + /*IncludeExperimental=false,IncludeDebug=false*/); EXPECT_FALSE(llvm::any_of(StableCheckers, IsDebugChecker)); EXPECT_FALSE(llvm::any_of(StableCheckers, IsAlphaChecker)); }