Tweak AnalyzerOptions::getOptionAsInteger() to populate the string
authorTed Kremenek <kremenek@apple.com>
Tue, 2 Oct 2012 20:31:56 +0000 (20:31 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 2 Oct 2012 20:31:56 +0000 (20:31 +0000)
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

clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
clang/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
clang/test/Analysis/analyzer-config.c
clang/test/Analysis/analyzer-config.cpp

index 852f8bb..091155c 100644 (file)
@@ -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.
index bb1acb0..6fbd2e1 100644 (file)
@@ -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();
 }
 
index 7a37a51..e9cfd0d 100644 (file)
@@ -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
index 32196bf..414324e 100644 (file)
@@ -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