diff options
author | Gabor Horvath <xazax.hun@gmail.com> | 2015-07-09 21:43:45 +0000 |
---|---|---|
committer | Gabor Horvath <xazax.hun@gmail.com> | 2015-07-09 21:43:45 +0000 |
commit | fc4c4d4441c2aab101b3964c2344412af52482c5 (patch) | |
tree | af92c7b06446fa301f2abca6222e6eee7b5d2312 /clang/lib/StaticAnalyzer/Core/CheckerRegistry.cpp | |
parent | c8704b02df54ff109f3fe28798aed5ff8b8ecb29 (diff) | |
download | bcm5719-llvm-fc4c4d4441c2aab101b3964c2344412af52482c5.tar.gz bcm5719-llvm-fc4c4d4441c2aab101b3964c2344412af52482c5.zip |
[Static Analyzer] Basic per checker command line option validation.
Differential Revision: http://reviews.llvm.org/D8077
llvm-svn: 241863
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/CheckerRegistry.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/CheckerRegistry.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/CheckerRegistry.cpp b/clang/lib/StaticAnalyzer/Core/CheckerRegistry.cpp index b64e30b3100..6ba64f52d18 100644 --- a/clang/lib/StaticAnalyzer/Core/CheckerRegistry.cpp +++ b/clang/lib/StaticAnalyzer/Core/CheckerRegistry.cpp @@ -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" @@ -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. |