[analyzer] Insert checker options into AnalyzerOption::ConfigTable
The more entries we have in AnalyzerOptions::ConfigTable, the more helpful debug.ConfigDumper is. With this patch, I'm pretty confident that it'll now emit the entire state of the analyzer, minus the frontend flags. It would be nice to reserve the config table specifically to checker options only, as storing the regular analyzer configs is kinda redundant. Differential Revision: https://reviews.llvm.org/D57922 llvm-svn: 361006
This commit is contained in:
parent
7f605c3550
commit
30b2307da8
|
@ -163,7 +163,7 @@ int AnalyzerOptions::getCheckerIntegerOption(StringRef CheckerName,
|
|||
bool HasFailed = getCheckerStringOption(CheckerName, OptionName,
|
||||
std::to_string(DefaultVal),
|
||||
SearchInParents)
|
||||
.getAsInteger(10, Ret);
|
||||
.getAsInteger(0, Ret);
|
||||
assert(!HasFailed && "analyzer-config option should be numeric");
|
||||
(void)HasFailed;
|
||||
return Ret;
|
||||
|
|
|
@ -309,27 +309,31 @@ void CheckerRegistry::addDependency(StringRef FullName, StringRef Dependency) {
|
|||
template <class T>
|
||||
static void
|
||||
insertOptionToCollection(StringRef FullName, T &Collection,
|
||||
const CheckerRegistry::CmdLineOption &&Option) {
|
||||
const CheckerRegistry::CmdLineOption &Option,
|
||||
AnalyzerOptions &AnOpts) {
|
||||
auto It = binaryFind(Collection, FullName);
|
||||
assert(It != Collection.end() &&
|
||||
"Failed to find the checker while attempting to add a command line "
|
||||
"option to it!");
|
||||
|
||||
It->CmdLineOptions.emplace_back(std::move(Option));
|
||||
AnOpts.Config.insert(
|
||||
{(FullName + ":" + Option.OptionName).str(), Option.DefaultValStr});
|
||||
|
||||
It->CmdLineOptions.emplace_back(Option);
|
||||
}
|
||||
|
||||
void CheckerRegistry::resolveCheckerAndPackageOptions() {
|
||||
for (const std::pair<StringRef, CmdLineOption> &CheckerOptEntry :
|
||||
CheckerOptions) {
|
||||
insertOptionToCollection(CheckerOptEntry.first, Checkers,
|
||||
std::move(CheckerOptEntry.second));
|
||||
CheckerOptEntry.second, AnOpts);
|
||||
}
|
||||
CheckerOptions.clear();
|
||||
|
||||
for (const std::pair<StringRef, CmdLineOption> &PackageOptEntry :
|
||||
PackageOptions) {
|
||||
insertOptionToCollection(PackageOptEntry.first, Checkers,
|
||||
std::move(PackageOptEntry.second));
|
||||
PackageOptEntry.second, AnOpts);
|
||||
}
|
||||
PackageOptions.clear();
|
||||
}
|
||||
|
|
|
@ -1,8 +1,13 @@
|
|||
// RUN: %clang_analyze_cc1 -triple x86_64-apple-darwin10 %s -o /dev/null -analyzer-checker=core,osx.cocoa,debug.ConfigDumper -analyzer-max-loop 34 > %t 2>&1
|
||||
// RUN: %clang_analyze_cc1 -analyzer-checker=debug.ConfigDumper > %t 2>&1
|
||||
// RUN: FileCheck --input-file=%t %s --match-full-lines
|
||||
|
||||
// CHECK: [config]
|
||||
// CHECK-NEXT: aggressive-binary-operation-simplification = false
|
||||
// CHECK-NEXT: alpha.clone.CloneChecker:IgnoredFilesPattern = ""
|
||||
// CHECK-NEXT: alpha.clone.CloneChecker:MinimumCloneComplexity = 50
|
||||
// CHECK-NEXT: alpha.clone.CloneChecker:ReportNormalClones = true
|
||||
// CHECK-NEXT: alpha.security.MmapWriteExec:MmapProtExec = 0x04
|
||||
// CHECK-NEXT: alpha.security.MmapWriteExec:MmapProtRead = 0x01
|
||||
// CHECK-NEXT: avoid-suppressing-null-argument-paths = false
|
||||
// CHECK-NEXT: c++-allocator-inlining = true
|
||||
// CHECK-NEXT: c++-container-inlining = false
|
||||
|
@ -18,9 +23,26 @@
|
|||
// CHECK-NEXT: cfg-rich-constructors = true
|
||||
// CHECK-NEXT: cfg-scopes = false
|
||||
// CHECK-NEXT: cfg-temporary-dtors = true
|
||||
// CHECK-NEXT: cplusplus.Move:WarnOn = KnownsAndLocals
|
||||
// CHECK-NEXT: crosscheck-with-z3 = false
|
||||
// CHECK-NEXT: ctu-dir = ""
|
||||
// CHECK-NEXT: ctu-index-name = externalDefMap.txt
|
||||
// CHECK-NEXT: debug.AnalysisOrder:* = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:Bind = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:EndFunction = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:LiveSymbols = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:NewAllocator = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:PostCall = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:PostStmtArraySubscriptExpr = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:PostStmtCXXNewExpr = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:PostStmtCastExpr = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:PostStmtOffsetOfExpr = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:PreCall = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:PreStmtArraySubscriptExpr = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:PreStmtCXXNewExpr = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:PreStmtCastExpr = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:PreStmtOffsetOfExpr = false
|
||||
// CHECK-NEXT: debug.AnalysisOrder:RegionChanges = false
|
||||
// CHECK-NEXT: display-ctu-progress = false
|
||||
// CHECK-NEXT: eagerly-assume = true
|
||||
// CHECK-NEXT: elide-constructors = true
|
||||
|
@ -40,7 +62,19 @@
|
|||
// CHECK-NEXT: mode = deep
|
||||
// CHECK-NEXT: model-path = ""
|
||||
// CHECK-NEXT: notes-as-events = false
|
||||
// CHECK-NEXT: nullability:NoDiagnoseCallsToSystemHeaders = false
|
||||
// CHECK-NEXT: objc-inlining = true
|
||||
// CHECK-NEXT: optin.cplusplus.UninitializedObject:CheckPointeeInitialization = false
|
||||
// CHECK-NEXT: optin.cplusplus.UninitializedObject:IgnoreGuardedFields = false
|
||||
// CHECK-NEXT: optin.cplusplus.UninitializedObject:IgnoreRecordsWithField = ""
|
||||
// CHECK-NEXT: optin.cplusplus.UninitializedObject:NotesAsWarnings = false
|
||||
// CHECK-NEXT: optin.cplusplus.UninitializedObject:Pedantic = false
|
||||
// CHECK-NEXT: optin.cplusplus.VirtualCall:PureOnly = false
|
||||
// CHECK-NEXT: optin.osx.cocoa.localizability.NonLocalizedStringChecker:AggressiveReport = false
|
||||
// CHECK-NEXT: optin.performance.Padding:AllowedPad = 24
|
||||
// CHECK-NEXT: osx.NumberObjectConversion:Pedantic = false
|
||||
// CHECK-NEXT: osx.cocoa.RetainCount:CheckOSObject = true
|
||||
// CHECK-NEXT: osx.cocoa.RetainCount:TrackNSCFStartParam = false
|
||||
// CHECK-NEXT: prune-paths = true
|
||||
// CHECK-NEXT: region-store-small-struct-limit = 2
|
||||
// CHECK-NEXT: report-in-main-source-file = false
|
||||
|
@ -49,7 +83,8 @@
|
|||
// CHECK-NEXT: suppress-c++-stdlib = true
|
||||
// CHECK-NEXT: suppress-inlined-defensive-checks = true
|
||||
// CHECK-NEXT: suppress-null-return-paths = true
|
||||
// CHECK-NEXT: unix.DynamicMemoryModeling:Optimistic = false
|
||||
// CHECK-NEXT: unroll-loops = false
|
||||
// CHECK-NEXT: widen-loops = false
|
||||
// CHECK-NEXT: [stats]
|
||||
// CHECK-NEXT: num-entries = 49
|
||||
// CHECK-NEXT: num-entries = 84
|
||||
|
|
|
@ -45,3 +45,20 @@ void caller() {
|
|||
// RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-CHECKER-OPTION-OUTPUT-TRUE
|
||||
|
||||
// CHECK-CHECKER-OPTION-OUTPUT-TRUE: Example option is set to true
|
||||
|
||||
// RUN: %clang_analyze_cc1 %s \
|
||||
// RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\
|
||||
// RUN: -analyzer-checker=example.MyChecker \
|
||||
// RUN: -analyzer-checker=debug.ConfigDumper \
|
||||
// RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-CHECKER-OPTION
|
||||
|
||||
// CHECK-CHECKER-OPTION: example.MyChecker:ExampleOption = false
|
||||
|
||||
// RUN: %clang_analyze_cc1 %s \
|
||||
// RUN: -load %llvmshlibdir/CheckerOptionHandlingAnalyzerPlugin%pluginext\
|
||||
// RUN: -analyzer-checker=example.MyChecker \
|
||||
// RUN: -analyzer-checker=debug.ConfigDumper \
|
||||
// RUN: -analyzer-config example.MyChecker:ExampleOption=true \
|
||||
// RUN: 2>&1 | FileCheck %s -check-prefix=CHECK-CHECKER-OPTION-TRUE
|
||||
|
||||
// CHECK-CHECKER-OPTION-TRUE: example.MyChecker:ExampleOption = true
|
||||
|
|
Loading…
Reference in New Issue