Skip to content

Commit

Permalink
Add a method to get the list of registered static analyzer checkers.
Browse files Browse the repository at this point in the history
Summary:
This provides a better interface for clang-tidy and encapsulates the knowledge
about experimental checkers instead of leaving this to the clients.

Reviewers: zaks.anna

Subscribers: a.sidorin, NoQ, dcoughlin, cfe-commits

Differential Revision: https://reviews.llvm.org/D26310

llvm-svn: 286218
  • Loading branch information
alexfh committed Nov 8, 2016
1 parent a8ca3ed commit 8df2a62
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 0 deletions.
3 changes: 3 additions & 0 deletions clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
Expand Up @@ -125,6 +125,9 @@ class AnalyzerOptions : public RefCountedBase<AnalyzerOptions> {
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;

Expand Down
19 changes: 19 additions & 0 deletions clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
Expand Up @@ -23,6 +23,25 @@ using namespace clang;
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 (!CheckName.startswith("debug.") &&
(IncludeExperimental || !CheckName.startswith("alpha.")))
Result.push_back(CheckName);
}
return Result;
}

AnalyzerOptions::UserModeKind AnalyzerOptions::getUserMode() {
if (UserMode == UMK_NotSet) {
StringRef ModeStr =
Expand Down
17 changes: 17 additions & 0 deletions clang/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
Expand Up @@ -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_FALSE(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";
Expand Down

0 comments on commit 8df2a62

Please sign in to comment.