Skip to content

Commit

Permalink
[Static Analyzer] Basic per checker command line option validation.
Browse files Browse the repository at this point in the history
Differential Revision: http://reviews.llvm.org/D8077

llvm-svn: 241863
  • Loading branch information
Xazax-hun committed Jul 9, 2015
1 parent c8704b0 commit fc4c4d4
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 0 deletions.
7 changes: 7 additions & 0 deletions clang/include/clang/StaticAnalyzer/Core/CheckerRegistry.h
Expand Up @@ -64,6 +64,9 @@
#endif

namespace clang {
class DiagnosticsEngine;
class AnalyzerOptions;

namespace ento {

class CheckerOptInfo;
Expand Down Expand Up @@ -118,6 +121,10 @@ class CheckerRegistry {
void initializeManager(CheckerManager &mgr,
SmallVectorImpl<CheckerOptInfo> &opts) const;

/// Check if every option corresponds to a specific checker or package.
void validateCheckerOptions(const AnalyzerOptions &opts,
DiagnosticsEngine &diags) const;

/// Prints the name and description of all checkers in this registry.
/// This output is not intended to be machine-parseable.
void printHelp(raw_ostream &out, size_t maxNameChars = 30) const ;
Expand Down
25 changes: 25 additions & 0 deletions clang/lib/StaticAnalyzer/Core/CheckerRegistry.cpp
Expand Up @@ -8,7 +8,10 @@
//===----------------------------------------------------------------------===//

#include "clang/StaticAnalyzer/Core/CheckerRegistry.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Frontend/FrontendDiagnostic.h"
#include "clang/StaticAnalyzer/Core/CheckerOptInfo.h"
#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/Support/raw_ostream.h"

Expand Down Expand Up @@ -111,6 +114,28 @@ void CheckerRegistry::initializeManager(CheckerManager &checkerMgr,
}
}

void CheckerRegistry::validateCheckerOptions(const AnalyzerOptions &opts,
DiagnosticsEngine &diags) const {
for (auto &config : opts.Config) {
size_t pos = config.getKey().find(':');
if (pos == StringRef::npos)
continue;

bool hasChecker = false;
StringRef checkerName = config.getKey().substr(0, pos);
for (auto &checker : Checkers) {
if (checker.FullName.startswith(checkerName) &&
(checker.FullName.size() == pos || checker.FullName[pos] == '.')) {
hasChecker = true;
break;
}
}
if (!hasChecker) {
diags.Report(diag::err_unknown_analyzer_checker) << checkerName;
}
}
}

void CheckerRegistry::printHelp(raw_ostream &out,
size_t maxNameChars) const {
// FIXME: Alphabetical sort puts 'experimental' in the middle.
Expand Down
1 change: 1 addition & 0 deletions clang/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
Expand Up @@ -114,6 +114,7 @@ ento::createCheckerManager(AnalyzerOptions &opts, const LangOptions &langOpts,

ClangCheckerRegistry allCheckers(plugins, &diags);
allCheckers.initializeManager(*checkerMgr, checkerOpts);
allCheckers.validateCheckerOptions(opts, diags);
checkerMgr->finishedCheckerRegistration();

for (unsigned i = 0, e = checkerOpts.size(); i != e; ++i) {
Expand Down
12 changes: 12 additions & 0 deletions clang/test/Analysis/analyzer-checker-config.c
@@ -0,0 +1,12 @@
// RUN: not %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-config unix.mallo:Optimistic=true 2>&1 | FileCheck %s
// RUN: not %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-config uni:Optimistic=true 2>&1 | FileCheck %s
// RUN: not %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-config uni.:Optimistic=true 2>&1 | FileCheck %s
// RUN: not %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-config ..:Optimistic=true 2>&1 | FileCheck %s
// RUN: not %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-config unix.:Optimistic=true 2>&1 | FileCheck %s
// RUN: not %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-config unrelated:Optimistic=true 2>&1 | FileCheck %s
// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-config unix.Malloc:Optimistic=true

// Just to test clang is working.
# foo

// CHECK: error:

0 comments on commit fc4c4d4

Please sign in to comment.