[PATCH] D16044: getVariableName() for MemRegion

Alexander Droste via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 24 08:08:53 PST 2016


Alexander_Droste updated this revision to Diff 48940.
Alexander_Droste added a comment.

Changes:

- remove `if (VariableName.size() && VariableName.back() == '\'')` check
- call `getVariableName` for index if Region is no `ConcreteInt`

Hi Gábor,
sorry about the delay! Here's the updated patch.
Is it really possible to reduce string copying in this case, with the help of `llvm::Twine`?
The problem with `llvm::Twine` seems to me that it cannot be modified after initialisation. 
So there's no way to do sth. like: `Twine t("a" + "b"); t += "c"`. A new Twine object needs to
be created for each subsequent concatenation. Do you have an idea how twine could be
applied here? Else I would claim that this function gets only used for diagnostics why 
this level of efficiency might not be required.


http://reviews.llvm.org/D16044

Files:
  include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h
  lib/StaticAnalyzer/Core/MemRegion.cpp

Index: include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h
===================================================================
--- include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h
+++ include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h
@@ -150,6 +150,14 @@
   template<typename RegionTy> const RegionTy* getAs() const;
 
   virtual bool isBoundable() const { return false; }
+
+  /// Get variable name for memory region. The name is obtained from
+  /// the variable/field declaration retrieved from the memory region.
+  /// Regions that point to an element of an array are returned as: "arr[0]".
+  /// Regions that point to a struct are returned as: "st.var".
+  ///
+  /// \returns variable name for memory region
+  std::string getVariableName() const;
 };
 
 /// MemSpaceRegion - A memory region that represents a "memory space";
Index: lib/StaticAnalyzer/Core/MemRegion.cpp
===================================================================
--- lib/StaticAnalyzer/Core/MemRegion.cpp
+++ lib/StaticAnalyzer/Core/MemRegion.cpp
@@ -632,6 +632,48 @@
   superRegion->printPrettyAsExpr(os);
 }
 
+std::string MemRegion::getVariableName() const {
+  std::string VariableName{""};
+  std::string ArrayIndices{""};
+  const clang::ento::MemRegion *R = this;
+  llvm::SmallString<50> buf;
+  llvm::raw_svector_ostream os(buf);
+
+  // Obtain array indices to add them to the variable name.
+  const clang::ento::ElementRegion *ER = nullptr;
+  while ((ER = R->getAs<clang::ento::ElementRegion>())) {
+    std::string idx{""};
+    // Index is a ConcreteInt.
+    if (auto CI = ER->getIndex().getAs<clang::ento::nonloc::ConcreteInt>()) {
+      llvm::SmallString<2> intValAsString;
+      CI->getValue().toString(intValAsString);
+      idx = {intValAsString.begin(), intValAsString.end()};
+    }
+    // If not a ConcreteInt, try to obtain the variable
+    // name by calling 'getVariableName()' recursively.
+    else {
+      idx = R->getVariableName();
+      if (!idx.empty()) {
+        // Exclude single quotes surrounding the index var name.
+        idx = idx.substr(1, idx.size() - 2);
+      }
+    }
+    ArrayIndices += "]" + idx + "[";
+    R = ER->getSuperRegion();
+  }
+  std::reverse(ArrayIndices.begin(), ArrayIndices.end());
+
+  // Get variable name.
+  if (R && R->canPrintPretty()) {
+    R->printPretty(os);
+    VariableName = os.str();
+    // Combine variable name with indices.
+    VariableName.insert(VariableName.size() - 1, ArrayIndices);
+  }
+
+  return VariableName;
+}
+
 //===----------------------------------------------------------------------===//
 // MemRegionManager methods.
 //===----------------------------------------------------------------------===//


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16044.48940.patch
Type: text/x-patch
Size: 2727 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160224/cecb8dd7/attachment.bin>


More information about the cfe-commits mailing list