diff options
| author | Ted Kremenek <kremenek@apple.com> | 2012-10-02 20:31:56 +0000 | 
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2012-10-02 20:31:56 +0000 | 
| commit | 3c6932922e52b3cfa18dedcf4f62fe8bbb2473e2 (patch) | |
| tree | 68567ada1f8c28e0ee65d5605e5c088d6bc652e1 /clang | |
| parent | 5faa5e04a36432f3187b9f4f0d9ac86d2aadad37 (diff) | |
| download | bcm5719-llvm-3c6932922e52b3cfa18dedcf4f62fe8bbb2473e2.tar.gz bcm5719-llvm-3c6932922e52b3cfa18dedcf4f62fe8bbb2473e2.zip  | |
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
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h | 4 | ||||
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp | 28 | ||||
| -rw-r--r-- | clang/test/Analysis/analyzer-config.c | 3 | ||||
| -rw-r--r-- | clang/test/Analysis/analyzer-config.cpp | 3 | 
4 files changed, 19 insertions, 19 deletions
diff --git a/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h b/clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h index 852f8bb9c54..091155ca60c 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 bb1acb0ce8f..6fbd2e1c6d1 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<Optional<unsigned> &>(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 7a37a51b8ee..e9cfd0d3e65 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 32196bfff8d..414324e8bc3 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  | 

