Index: cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp @@ -163,7 +163,7 @@ 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; Index: cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp +++ cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp @@ -309,27 +309,31 @@ 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(); } Index: cfe/trunk/test/Analysis/analyzer-config.c =================================================================== --- cfe/trunk/test/Analysis/analyzer-config.c +++ cfe/trunk/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 Index: cfe/trunk/test/Analysis/checker-plugins.c =================================================================== --- cfe/trunk/test/Analysis/checker-plugins.c +++ cfe/trunk/test/Analysis/checker-plugins.c @@ -45,3 +45,20 @@ // 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