Szelethus updated this revision to Diff 189107. Szelethus added a comment. Herald added a reviewer: teemperor. Herald added a subscriber: Charusso. This revision now requires review to proceed.
Remove the default value parameters from `getChecker*Option`, as they are no longer necessary. Note the changes to the unit test file: since the current thinking is that all options must've been validated by `CheckerRegistry`, if any irregularities are detected within those methods, we no longer return default values or even dream of a peaceful termination, as it clearly indicates a programming error, hence the removal of some test cases as asserts can't be tested. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D57922/new/ https://reviews.llvm.org/D57922 Files: include/clang/StaticAnalyzer/Core/AnalyzerOptions.h lib/StaticAnalyzer/Checkers/AnalysisOrderChecker.cpp lib/StaticAnalyzer/Checkers/CloneChecker.cpp lib/StaticAnalyzer/Checkers/LocalizationChecker.cpp lib/StaticAnalyzer/Checkers/MallocChecker.cpp lib/StaticAnalyzer/Checkers/MmapWriteExecChecker.cpp lib/StaticAnalyzer/Checkers/MoveChecker.cpp lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp lib/StaticAnalyzer/Checkers/PaddingChecker.cpp lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp lib/StaticAnalyzer/Core/AnalyzerOptions.cpp lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp test/Analysis/analyzer-config.c unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
Index: unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp =================================================================== --- unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp +++ unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp @@ -51,25 +51,24 @@ // CheckerTwo one has Option specified as true. It should read true regardless // of search mode. CheckerOneMock CheckerOne; - EXPECT_TRUE(Opts.getCheckerBooleanOption(&CheckerOne, "Option", false)); + EXPECT_TRUE(Opts.getCheckerBooleanOption(&CheckerOne, "Option")); // The package option is overridden with a checker option. - EXPECT_TRUE(Opts.getCheckerBooleanOption(&CheckerOne, "Option", false, - true)); + EXPECT_TRUE(Opts.getCheckerBooleanOption(&CheckerOne, "Option", true)); // The Outer package option is overridden by the Inner package option. No // package option is specified. - EXPECT_TRUE(Opts.getCheckerBooleanOption(&CheckerOne, "Option2", false, - true)); - // No package option is specified and search in packages is turned off. The - // default value should be returned. - EXPECT_FALSE(Opts.getCheckerBooleanOption(&CheckerOne, "Option2", false)); EXPECT_TRUE(Opts.getCheckerBooleanOption(&CheckerOne, "Option2", true)); + // No package option is specified and search in packages is turned off. We + // should assert here, but we can't test that. + //Opts.getCheckerBooleanOption(&CheckerOne, "Option2"); + //Opts.getCheckerBooleanOption(&CheckerOne, "Option2"); - // Checker true has no option specified. It should get the default value when - // search in parents turned off and false when search in parents turned on. + // Checker true has no option specified. It should get false when search in + // parents turned on. CheckerTwoMock CheckerTwo; - EXPECT_FALSE(Opts.getCheckerBooleanOption(&CheckerTwo, "Option", false)); - EXPECT_TRUE(Opts.getCheckerBooleanOption(&CheckerTwo, "Option", true)); - EXPECT_FALSE(Opts.getCheckerBooleanOption(&CheckerTwo, "Option", true, true)); + EXPECT_FALSE(Opts.getCheckerBooleanOption(&CheckerTwo, "Option", true)); + // In any other case, we should assert, that we cannot test unfortunately. + //Opts.getCheckerBooleanOption(&CheckerTwo, "Option"); + //Opts.getCheckerBooleanOption(&CheckerTwo, "Option"); } TEST(StaticAnalyzerOptions, StringOptions) { @@ -84,16 +83,14 @@ CheckerOneMock CheckerOne; EXPECT_TRUE("StringValue" == - Opts.getCheckerStringOption(&CheckerOne, "Option", "DefaultValue")); - EXPECT_TRUE("DefaultValue" == - Opts.getCheckerStringOption(&CheckerOne, "Option2", "DefaultValue")); + Opts.getCheckerStringOption(&CheckerOne, "Option")); } TEST(StaticAnalyzerOptions, SubCheckerOptions) { AnalyzerOptions Opts; Opts.Config["Outer.Inner.CheckerOne:Option"] = "StringValue"; EXPECT_TRUE("StringValue" == Opts.getCheckerStringOption( - "Outer.Inner.CheckerOne", "Option", "DefaultValue")); + "Outer.Inner.CheckerOne", "Option")); } } // end namespace ento Index: test/Analysis/analyzer-config.c =================================================================== --- test/Analysis/analyzer-config.c +++ test/Analysis/analyzer-config.c @@ -3,6 +3,16 @@ // 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.cplusplus.UninitializedObject:CheckPointeeInitialization = false +// CHECK-NEXT: alpha.cplusplus.UninitializedObject:IgnoreGuardedFields = false +// CHECK-NEXT: alpha.cplusplus.UninitializedObject:IgnoreRecordsWithField = "" +// CHECK-NEXT: alpha.cplusplus.UninitializedObject:NotesAsWarnings = false +// CHECK-NEXT: alpha.cplusplus.UninitializedObject:Pedantic = false +// 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 +28,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 +67,15 @@ // 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.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: osx.cocoa.RetainCount:leak-diagnostics-reference-allocation = false // CHECK-NEXT: prune-paths = true // CHECK-NEXT: region-store-small-struct-limit = 2 // CHECK-NEXT: report-in-main-source-file = false @@ -49,7 +84,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 = 85 Index: lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp =================================================================== --- lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp +++ lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp @@ -327,6 +327,8 @@ CheckerIt->CmdLineOptions.emplace_back( OptionType, OptionName, DefaultValStr, Description); + + AnOpts.registerCheckerOption(CheckerFullName, OptionName, DefaultValStr); } void CheckerRegistry::addPackage(StringRef FullName) { @@ -346,6 +348,8 @@ PackageIt->CmdLineOptions.emplace_back( OptionType, OptionName, DefaultValStr, Description); + + AnOpts.registerPackageOption(FullName, OptionName, DefaultValStr); } void CheckerRegistry::initializeManager(CheckerManager &checkerMgr) const { Index: lib/StaticAnalyzer/Core/AnalyzerOptions.cpp =================================================================== --- lib/StaticAnalyzer/Core/AnalyzerOptions.cpp +++ lib/StaticAnalyzer/Core/AnalyzerOptions.cpp @@ -101,78 +101,97 @@ return *K >= Param; } +void AnalyzerOptions::registerCheckerOption(StringRef CheckerFullName, + StringRef OptionName, + StringRef DefaultVal) { + Config.insert({(Twine() + CheckerFullName + ":" + OptionName).str(), + DefaultVal}); +} + +void AnalyzerOptions::registerPackageOption(StringRef CheckerFullName, + StringRef OptionName, + StringRef DefaultVal) { + Config.insert({(Twine() + CheckerFullName + ":" + OptionName).str(), + DefaultVal}); +} + StringRef AnalyzerOptions::getCheckerStringOption(StringRef CheckerName, StringRef OptionName, - StringRef DefaultVal, bool SearchInParents ) const { assert(!CheckerName.empty() && "Empty checker name! Make sure the checker object (including it's " "bases!) if fully initialized before calling this function!"); ConfigTable::const_iterator E = Config.end(); + do { ConfigTable::const_iterator I = Config.find((Twine(CheckerName) + ":" + OptionName).str()); if (I != E) return StringRef(I->getValue()); + size_t Pos = CheckerName.rfind('.'); if (Pos == StringRef::npos) - return DefaultVal; + break; + CheckerName = CheckerName.substr(0, Pos); } while (!CheckerName.empty() && SearchInParents); - return DefaultVal; + + // Should control reach here, a getChecker*Option was called with incorrect + // parameters. Invalid user input is validated in CheckerRegistry. + llvm_unreachable("Unknown checker option!"); + + return ""; } StringRef AnalyzerOptions::getCheckerStringOption(const ento::CheckerBase *C, StringRef OptionName, - StringRef DefaultVal, - bool SearchInParents ) const { + bool SearchInParents) const { return getCheckerStringOption( - C->getTagDescription(), OptionName, DefaultVal, SearchInParents); + C->getTagDescription(), OptionName, SearchInParents); } bool AnalyzerOptions::getCheckerBooleanOption(StringRef CheckerName, StringRef OptionName, - bool DefaultVal, - bool SearchInParents ) const { - // FIXME: We should emit a warning here if the value is something other than - // "true", "false", or the empty string (meaning the default value), - // but the AnalyzerOptions doesn't have access to a diagnostic engine. - return llvm::StringSwitch<bool>( + bool SearchInParents) const { + auto Ret = llvm::StringSwitch<llvm::Optional<bool>>( getCheckerStringOption(CheckerName, OptionName, - DefaultVal ? "true" : "false", SearchInParents)) .Case("true", true) .Case("false", false) - .Default(DefaultVal); + .Default(None); + + assert(Ret && + "This option should be either 'true' or 'false', and should've been " + "validated by CheckerRegisrty::validateCheckerOptions!"); + + return *Ret; } bool AnalyzerOptions::getCheckerBooleanOption(const ento::CheckerBase *C, StringRef OptionName, - bool DefaultVal, - bool SearchInParents ) const { + bool SearchInParents) const { return getCheckerBooleanOption( - C->getTagDescription(), OptionName, DefaultVal, SearchInParents); + C->getTagDescription(), OptionName, SearchInParents); } int AnalyzerOptions::getCheckerIntegerOption(StringRef CheckerName, StringRef OptionName, - int DefaultVal, - bool SearchInParents ) const { - int Ret = DefaultVal; + bool SearchInParents) const { + int Ret = 0; bool HasFailed = getCheckerStringOption(CheckerName, OptionName, - std::to_string(DefaultVal), SearchInParents) - .getAsInteger(10, Ret); - assert(!HasFailed && "analyzer-config option should be numeric"); + .getAsInteger(0, Ret); + assert(!HasFailed && + "This option should be numeric, and should've been validated by " + "CheckerRegisrty::validateCheckerOptions!"); (void)HasFailed; return Ret; } int AnalyzerOptions::getCheckerIntegerOption(const ento::CheckerBase *C, StringRef OptionName, - int DefaultVal, - bool SearchInParents ) const { + bool SearchInParents) const { return getCheckerIntegerOption( - C->getTagDescription(), OptionName, DefaultVal, SearchInParents); + C->getTagDescription(), OptionName, SearchInParents); } Index: lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp +++ lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp @@ -279,8 +279,7 @@ VirtualCallChecker *checker = mgr.registerChecker<VirtualCallChecker>(); checker->IsPureOnly = - mgr.getAnalyzerOptions().getCheckerBooleanOption( - checker, "PureOnly", false); + mgr.getAnalyzerOptions().getCheckerBooleanOption(checker, "PureOnly"); } bool ento::shouldRegisterVirtualCallChecker(const LangOptions &LO) { Index: lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp +++ lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp @@ -611,18 +611,15 @@ AnalyzerOptions &AnOpts = Mgr.getAnalyzerOptions(); UninitObjCheckerOptions &ChOpts = Chk->Opts; - ChOpts.IsPedantic = - AnOpts.getCheckerBooleanOption(Chk, "Pedantic", /*DefaultVal*/ false); + ChOpts.IsPedantic = AnOpts.getCheckerBooleanOption(Chk, "Pedantic"); ChOpts.ShouldConvertNotesToWarnings = AnOpts.getCheckerBooleanOption( - Chk, "NotesAsWarnings", /*DefaultVal*/ false); + Chk, "NotesAsWarnings"); ChOpts.CheckPointeeInitialization = AnOpts.getCheckerBooleanOption( - Chk, "CheckPointeeInitialization", /*DefaultVal*/ false); + Chk, "CheckPointeeInitialization"); ChOpts.IgnoredRecordsWithFieldPattern = - AnOpts.getCheckerStringOption(Chk, "IgnoreRecordsWithField", - /*DefaultVal*/ "\"\""); + AnOpts.getCheckerStringOption(Chk, "IgnoreRecordsWithField"); ChOpts.IgnoreGuardedFields = - AnOpts.getCheckerBooleanOption(Chk, "IgnoreGuardedFields", - /*DefaultVal*/ false); + AnOpts.getCheckerBooleanOption(Chk, "IgnoreGuardedFields"); std::string ErrorMsg; if (!llvm::Regex(ChOpts.IgnoredRecordsWithFieldPattern).isValid(ErrorMsg)) Index: lib/StaticAnalyzer/Checkers/PaddingChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/PaddingChecker.cpp +++ lib/StaticAnalyzer/Checkers/PaddingChecker.cpp @@ -348,7 +348,7 @@ void ento::registerPaddingChecker(CheckerManager &Mgr) { auto *Checker = Mgr.registerChecker<PaddingChecker>(); Checker->AllowedPad = Mgr.getAnalyzerOptions() - .getCheckerIntegerOption(Checker, "AllowedPad", 24); + .getCheckerIntegerOption(Checker, "AllowedPad"); if (Checker->AllowedPad < 0) Mgr.reportInvalidCheckerOptionValue( Checker, "AllowedPad", "a non-negative value"); Index: lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp +++ lib/StaticAnalyzer/Checkers/NumberObjectConversionChecker.cpp @@ -346,7 +346,7 @@ NumberObjectConversionChecker *Chk = Mgr.registerChecker<NumberObjectConversionChecker>(); Chk->Pedantic = - Mgr.getAnalyzerOptions().getCheckerBooleanOption(Chk, "Pedantic", false); + Mgr.getAnalyzerOptions().getCheckerBooleanOption(Chk, "Pedantic"); } bool ento::shouldRegisterNumberObjectConversionChecker(const LangOptions &LO) { Index: lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp +++ lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp @@ -1208,7 +1208,7 @@ checker->NoDiagnoseCallsToSystemHeaders = \ checker->NoDiagnoseCallsToSystemHeaders || \ mgr.getAnalyzerOptions().getCheckerBooleanOption( \ - checker, "NoDiagnoseCallsToSystemHeaders", false, true); \ + checker, "NoDiagnoseCallsToSystemHeaders", true); \ } \ \ bool ento::shouldRegister##name##Checker(const LangOptions &LO) { \ Index: lib/StaticAnalyzer/Checkers/MoveChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/MoveChecker.cpp +++ lib/StaticAnalyzer/Checkers/MoveChecker.cpp @@ -740,8 +740,7 @@ void ento::registerMoveChecker(CheckerManager &mgr) { MoveChecker *chk = mgr.registerChecker<MoveChecker>(); chk->setAggressiveness( - mgr.getAnalyzerOptions().getCheckerStringOption(chk, "WarnOn", - "KnownsAndLocals"), mgr); + mgr.getAnalyzerOptions().getCheckerStringOption(chk, "WarnOn"), mgr); } bool ento::shouldRegisterMoveChecker(const LangOptions &LO) { Index: lib/StaticAnalyzer/Checkers/MmapWriteExecChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/MmapWriteExecChecker.cpp +++ lib/StaticAnalyzer/Checkers/MmapWriteExecChecker.cpp @@ -82,10 +82,10 @@ mgr.registerChecker<MmapWriteExecChecker>(); Mwec->ProtExecOv = mgr.getAnalyzerOptions() - .getCheckerIntegerOption(Mwec, "MmapProtExec", 0x04); + .getCheckerIntegerOption(Mwec, "MmapProtExec"); Mwec->ProtReadOv = mgr.getAnalyzerOptions() - .getCheckerIntegerOption(Mwec, "MmapProtRead", 0x01); + .getCheckerIntegerOption(Mwec, "MmapProtRead"); } bool ento::shouldRegisterMmapWriteExecChecker(const LangOptions &LO) { Index: lib/StaticAnalyzer/Checkers/MallocChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -3098,7 +3098,7 @@ void ento::registerDynamicMemoryModeling(CheckerManager &mgr) { auto *checker = mgr.registerChecker<MallocChecker>(); checker->IsOptimistic = mgr.getAnalyzerOptions().getCheckerBooleanOption( - checker, "Optimistic", false); + checker, "Optimistic"); } bool ento::shouldRegisterDynamicMemoryModeling(const LangOptions &LO) { Index: lib/StaticAnalyzer/Checkers/LocalizationChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/LocalizationChecker.cpp +++ lib/StaticAnalyzer/Checkers/LocalizationChecker.cpp @@ -1398,7 +1398,7 @@ mgr.registerChecker<NonLocalizedStringChecker>(); checker->IsAggressive = mgr.getAnalyzerOptions().getCheckerBooleanOption( - checker, "AggressiveReport", false); + checker, "AggressiveReport"); } bool ento::shouldRegisterNonLocalizedStringChecker(const LangOptions &LO) { Index: lib/StaticAnalyzer/Checkers/CloneChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/CloneChecker.cpp +++ lib/StaticAnalyzer/Checkers/CloneChecker.cpp @@ -195,17 +195,17 @@ auto *Checker = Mgr.registerChecker<CloneChecker>(); Checker->MinComplexity = Mgr.getAnalyzerOptions().getCheckerIntegerOption( - Checker, "MinimumCloneComplexity", 50); + Checker, "MinimumCloneComplexity"); if (Checker->MinComplexity < 0) Mgr.reportInvalidCheckerOptionValue( Checker, "MinimumCloneComplexity", "a non-negative value"); Checker->ReportNormalClones = Mgr.getAnalyzerOptions().getCheckerBooleanOption( - Checker, "ReportNormalClones", true); + Checker, "ReportNormalClones"); Checker->IgnoredFilesPattern = Mgr.getAnalyzerOptions() - .getCheckerStringOption(Checker, "IgnoredFilesPattern", ""); + .getCheckerStringOption(Checker, "IgnoredFilesPattern"); } bool ento::shouldRegisterCloneChecker(const LangOptions &LO) { Index: lib/StaticAnalyzer/Checkers/AnalysisOrderChecker.cpp =================================================================== --- lib/StaticAnalyzer/Checkers/AnalysisOrderChecker.cpp +++ lib/StaticAnalyzer/Checkers/AnalysisOrderChecker.cpp @@ -44,8 +44,8 @@ check::LiveSymbols> { bool isCallbackEnabled(AnalyzerOptions &Opts, StringRef CallbackName) const { - return Opts.getCheckerBooleanOption(this, "*", false) || - Opts.getCheckerBooleanOption(this, CallbackName, false); + return Opts.getCheckerBooleanOption(this, "*") || + Opts.getCheckerBooleanOption(this, CallbackName); } bool isCallbackEnabled(CheckerContext &C, StringRef CallbackName) const { Index: include/clang/StaticAnalyzer/Core/AnalyzerOptions.h =================================================================== --- include/clang/StaticAnalyzer/Core/AnalyzerOptions.h +++ include/clang/StaticAnalyzer/Core/AnalyzerOptions.h @@ -172,6 +172,7 @@ /// A key-value table of use-specified configuration values. // TODO: This shouldn't be public. ConfigTable Config; + AnalysisStores AnalysisStoreOpt = RegionStoreModel; AnalysisConstraints AnalysisConstraintsOpt = RangeConstraintsModel; AnalysisDiagClients AnalysisDiagOpt = PD_HTML; @@ -268,6 +269,18 @@ llvm::sort(AnalyzerConfigCmdFlags); } + /// Inserts a checker option with the specified default value. If the user + /// already specified this option when invoking the analyzer, nothing happens. + void registerCheckerOption(StringRef CheckerFullName, + StringRef OptionName, + StringRef DefaultValStr); + + /// Inserts a package option with the specified default value. If the user + /// already specified this option when invoking the analyzer, nothing happens. + void registerPackageOption(StringRef CheckerFullName, + StringRef OptionName, + StringRef DefaultValStr); + /// Interprets an option's string value as a boolean. The "true" string is /// interpreted as true and the "false" string is interpreted as false. /// @@ -279,18 +292,14 @@ /// Checker options are retrieved in the following format: /// `-analyzer-config CheckerName:OptionName=Value. /// @param [in] OptionName Name for option to retrieve. - /// @param [in] DefaultVal Default value returned if no such option was - /// specified. /// @param [in] SearchInParents If set to true and the searched option was not /// specified for the given checker the options for the parent packages will /// be searched as well. The inner packages take precedence over the outer /// ones. bool getCheckerBooleanOption(StringRef CheckerName, StringRef OptionName, - bool DefaultVal, bool SearchInParents = false) const; bool getCheckerBooleanOption(const ento::CheckerBase *C, StringRef OptionName, - bool DefaultVal, bool SearchInParents = false) const; /// Interprets an option's string value as an integer value. @@ -303,18 +312,14 @@ /// Checker options are retrieved in the following format: /// `-analyzer-config CheckerName:OptionName=Value. /// @param [in] OptionName Name for option to retrieve. - /// @param [in] DefaultVal Default value returned if no such option was - /// specified. /// @param [in] SearchInParents If set to true and the searched option was not /// specified for the given checker the options for the parent packages will /// be searched as well. The inner packages take precedence over the outer /// ones. int getCheckerIntegerOption(StringRef CheckerName, StringRef OptionName, - int DefaultVal, bool SearchInParents = false) const; int getCheckerIntegerOption(const ento::CheckerBase *C, StringRef OptionName, - int DefaultVal, bool SearchInParents = false) const; /// Query an option's string value. @@ -327,18 +332,15 @@ /// Checker options are retrieved in the following format: /// `-analyzer-config CheckerName:OptionName=Value. /// @param [in] OptionName Name for option to retrieve. - /// @param [in] DefaultVal Default value returned if no such option was - /// specified. /// @param [in] SearchInParents If set to true and the searched option was not /// specified for the given checker the options for the parent packages will /// be searched as well. The inner packages take precedence over the outer /// ones. StringRef getCheckerStringOption(StringRef CheckerName, StringRef OptionName, - StringRef DefaultVal, bool SearchInParents = false) const; StringRef getCheckerStringOption(const ento::CheckerBase *C, - StringRef OptionName, StringRef DefaultVal, + StringRef OptionName, bool SearchInParents = false) const; /// Retrieves and sets the UserMode. This is a high-level option,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits