From 94bb74cef72a33d77c5d6739abfc0840c781eb8e Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 2 Oct 2012 20:31:56 +0000 Subject: [PATCH] Tweak AnalyzerOptions::getOptionAsInteger() to populate the string table, making it printable with the ConfigDump checker. Along the way, fix a really serious bug where the value was getting parsed from the string in code that was in an assert() call. This means in a Release-Asserts build this code wouldn't work as expected. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165041 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../StaticAnalyzer/Core/AnalyzerOptions.h | 4 +-- lib/StaticAnalyzer/Core/AnalyzerOptions.cpp | 28 +++++++++---------- test/Analysis/analyzer-config.c | 3 +- test/Analysis/analyzer-config.cpp | 3 +- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h b/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h index 852f8bb9c5..091155ca60 100644 --- a/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h +++ b/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h @@ -195,7 +195,7 @@ private: bool getBooleanOption(StringRef Name, bool DefaultVal); /// Interprets an option's string value as an integer value. - int getOptionAsInteger(llvm::StringRef Name, int DefaultVal) const; + int getOptionAsInteger(llvm::StringRef Name, int DefaultVal); public: /// Returns the option controlling which C++ member functions will be @@ -243,7 +243,7 @@ public: // considered to be small enough to always inline. // // This is controlled by "ipa-always-inline-size" analyzer-config option. - unsigned getAlwaysInlineSize() const; + unsigned getAlwaysInlineSize(); /// Returns true if the analyzer engine should synthesize fake bodies /// for well-known functions. diff --git a/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp b/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp index bb1acb0ce8..6fbd2e1c6d 100644 --- a/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp +++ b/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp @@ -14,6 +14,8 @@ #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/Support/raw_ostream.h" using namespace clang; using namespace llvm; @@ -102,25 +104,21 @@ bool AnalyzerOptions::shouldPruneNullReturnPaths() { return *PruneNullReturnPaths; } -int AnalyzerOptions::getOptionAsInteger(StringRef Name, int DefaultVal) const { - std::string OptStr = Config.lookup(Name); - if (OptStr.empty()) - return DefaultVal; - +int AnalyzerOptions::getOptionAsInteger(StringRef Name, int DefaultVal) { + llvm::SmallString<10> StrBuf; + llvm::raw_svector_ostream OS(StrBuf); + OS << DefaultVal; + + StringRef V(Config.GetOrCreateValue(Name, OS.str()).getValue()); int Res = DefaultVal; - assert(StringRef(OptStr).getAsInteger(10, Res) == false && - "analyzer-config option should be numeric."); - + bool b = V.getAsInteger(10, Res); + assert(!b && "analyzer-config option should be numeric"); return Res; } -unsigned AnalyzerOptions::getAlwaysInlineSize() const { - if (!AlwaysInlineSize.hasValue()) { - unsigned DefaultSize = 3; - const_cast &>(AlwaysInlineSize) = - getOptionAsInteger("ipa-always-inline-size", DefaultSize); - } - +unsigned AnalyzerOptions::getAlwaysInlineSize() { + if (!AlwaysInlineSize.hasValue()) + AlwaysInlineSize = getOptionAsInteger("ipa-always-inline-size", 3); return AlwaysInlineSize.getValue(); } diff --git a/test/Analysis/analyzer-config.c b/test/Analysis/analyzer-config.c index 7a37a51b8e..e9cfd0d3e6 100644 --- a/test/Analysis/analyzer-config.c +++ b/test/Analysis/analyzer-config.c @@ -7,5 +7,6 @@ void foo() { bar(); } // CHECK: [config] // CHECK-NEXT: cfg-temporary-dtors = false // CHECK-NEXT: faux-bodies = true +// CHECK-NEXT: ipa-always-inline-size = 3 // CHECK-NEXT: [stats] -// CHECK-NEXT: num-entries = 2 +// CHECK-NEXT: num-entries = 3 diff --git a/test/Analysis/analyzer-config.cpp b/test/Analysis/analyzer-config.cpp index 32196bfff8..414324e8bc 100644 --- a/test/Analysis/analyzer-config.cpp +++ b/test/Analysis/analyzer-config.cpp @@ -16,5 +16,6 @@ public: // CHECK-NEXT: c++-template-inlining = true // CHECK-NEXT: cfg-temporary-dtors = false // CHECK-NEXT: faux-bodies = true +// CHECK-NEXT: ipa-always-inline-size = 3 // CHECK-NEXT: [stats] -// CHECK-NEXT: num-entries = 5 +// CHECK-NEXT: num-entries = 6 -- 2.40.0