From: Ted Kremenek Date: Tue, 2 Oct 2012 20:31:56 +0000 (+0000) Subject: Tweak AnalyzerOptions::getOptionAsInteger() to populate the string X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3c6932922e52b3cfa18dedcf4f62fe8bbb2473e2;p=platform%2Fupstream%2Fllvm.git 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. llvm-svn: 165041 --- diff --git a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h b/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h index 852f8bb..091155c 100644 --- a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h +++ b/clang/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/clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp b/clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp index bb1acb0..6fbd2e1 100644 --- a/clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp +++ b/clang/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/clang/test/Analysis/analyzer-config.c b/clang/test/Analysis/analyzer-config.c index 7a37a51..e9cfd0d 100644 --- a/clang/test/Analysis/analyzer-config.c +++ b/clang/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/clang/test/Analysis/analyzer-config.cpp b/clang/test/Analysis/analyzer-config.cpp index 32196bf..414324e 100644 --- a/clang/test/Analysis/analyzer-config.cpp +++ b/clang/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