From: Kristof Umann Date: Fri, 17 May 2019 09:29:44 +0000 (+0000) Subject: [analyzer] Insert checker options into AnalyzerOption::ConfigTable X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=786546290e1a65c82093c02bbf7f3c7724afa8ca;p=clang [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@361006 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp b/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp index 893c72190e..1ac1cc214f 100644 --- a/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp +++ b/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp @@ -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; diff --git a/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp b/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp index 4267d8a2cd..7eef09b883 100644 --- a/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp +++ b/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp @@ -309,27 +309,31 @@ void CheckerRegistry::addDependency(StringRef FullName, StringRef Dependency) { template 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 &CheckerOptEntry : CheckerOptions) { insertOptionToCollection(CheckerOptEntry.first, Checkers, - std::move(CheckerOptEntry.second)); + CheckerOptEntry.second, AnOpts); } CheckerOptions.clear(); for (const std::pair &PackageOptEntry : PackageOptions) { insertOptionToCollection(PackageOptEntry.first, Checkers, - std::move(PackageOptEntry.second)); + PackageOptEntry.second, AnOpts); } PackageOptions.clear(); } diff --git a/test/Analysis/analyzer-config.c b/test/Analysis/analyzer-config.c index 50b5c2dcf6..38bf5cc60c 100644 --- a/test/Analysis/analyzer-config.c +++ b/test/Analysis/analyzer-config.c @@ -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 diff --git a/test/Analysis/checker-plugins.c b/test/Analysis/checker-plugins.c index 4ed4e8630e..1e0d6c6341 100644 --- a/test/Analysis/checker-plugins.c +++ b/test/Analysis/checker-plugins.c @@ -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