[clang] 469520e - Revert "[analyzer][NFC] Make RegionStore dumps deterministic" (#115881)

via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 12 07:24:00 PST 2024


Author: Balazs Benics
Date: 2024-11-12T16:23:57+01:00
New Revision: 469520ed9acc1308a492d03cf859703054a61730

URL: https://github.com/llvm/llvm-project/commit/469520ed9acc1308a492d03cf859703054a61730
DIFF: https://github.com/llvm/llvm-project/commit/469520ed9acc1308a492d03cf859703054a61730.diff

LOG: Revert "[analyzer][NFC] Make RegionStore dumps deterministic" (#115881)

Reverts llvm/llvm-project#115615

There are two problems with this PR:
1) If any of the dumps contains a store with a symbolic binding, we
crash.
2) The memory space clusters come last among the clusters, which is not
what I intended.

I'm reverting because of the crash.

Added: 
    

Modified: 
    clang/lib/StaticAnalyzer/Core/RegionStore.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
index 085f0ef9a5fb96..674099dd7e1f0f 100644
--- a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
+++ b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp
@@ -67,8 +67,8 @@ class BindingKey {
             isa<ObjCIvarRegion, CXXDerivedObjectRegion>(r)) &&
            "Not a base");
   }
-
 public:
+
   bool isDirect() const { return P.getInt() & Direct; }
   bool hasSymbolicOffset() const { return P.getInt() & Symbolic; }
 
@@ -232,75 +232,27 @@ class RegionBindingsRef : public llvm::ImmutableMapRef<const MemRegion *,
 
   void printJson(raw_ostream &Out, const char *NL = "\n",
                  unsigned int Space = 0, bool IsDot = false) const {
-    using namespace llvm;
-    DenseMap<const MemRegion *, std::string> StringifyCache;
-    auto ToString = [&StringifyCache](const MemRegion *R) {
-      auto [Place, Inserted] = StringifyCache.try_emplace(R);
-      if (!Inserted)
-        return Place->second;
-      std::string Res;
-      raw_string_ostream OS(Res);
-      OS << R;
-      Place->second = Res;
-      return Res;
-    };
-
-    using Cluster =
-        std::pair<const MemRegion *, ImmutableMap<BindingKey, SVal>>;
-    using Binding = std::pair<BindingKey, SVal>;
-
-    const auto ClusterSortKey = [&ToString](const Cluster *C) {
-      const MemRegion *Key = C->first;
-      return std::tuple{isa<MemSpaceRegion>(Key), ToString(Key)};
-    };
-
-    const auto MemSpaceBeforeRegionName = [&ClusterSortKey](const Cluster *L,
-                                                            const Cluster *R) {
-      return ClusterSortKey(L) < ClusterSortKey(R);
-    };
-
-    const auto BindingSortKey = [&ToString](const Binding *BPtr) {
-      const BindingKey &Key = BPtr->first;
-      return std::tuple{Key.isDirect(), !Key.hasSymbolicOffset(),
-                        ToString(Key.getRegion()), Key.getOffset()};
-    };
-
-    const auto DefaultBindingBeforeDirectBindings =
-        [&BindingSortKey](const Binding *LPtr, const Binding *RPtr) {
-          return BindingSortKey(LPtr) < BindingSortKey(RPtr);
-        };
-
-    const auto AddrOf = [](const auto &Item) { return &Item; };
-
-    std::vector<const Cluster *> SortedClusters;
-    SortedClusters.reserve(std::distance(begin(), end()));
-    append_range(SortedClusters, map_range(*this, AddrOf));
-    llvm::sort(SortedClusters, MemSpaceBeforeRegionName);
-
-    for (auto [Idx, C] : llvm::enumerate(SortedClusters)) {
-      const auto &[BaseRegion, Bindings] = *C;
+    for (iterator I = begin(), E = end(); I != E; ++I) {
+      // TODO: We might need a .printJson for I.getKey() as well.
       Indent(Out, Space, IsDot)
-          << "{ \"cluster\": \"" << BaseRegion << "\", \"pointer\": \""
-          << (const void *)BaseRegion << "\", \"items\": [" << NL;
-
-      std::vector<const Binding *> SortedBindings;
-      SortedBindings.reserve(std::distance(Bindings.begin(), Bindings.end()));
-      append_range(SortedBindings, map_range(Bindings, AddrOf));
-      llvm::sort(SortedBindings, DefaultBindingBeforeDirectBindings);
+          << "{ \"cluster\": \"" << I.getKey() << "\", \"pointer\": \""
+          << (const void *)I.getKey() << "\", \"items\": [" << NL;
 
       ++Space;
-      for (auto [Idx, B] : llvm::enumerate(SortedBindings)) {
-        const auto &[Key, Value] = *B;
-        Indent(Out, Space, IsDot) << "{ " << Key << ", \"value\": ";
-        Value.printJson(Out, /*AddQuotes=*/true);
+      const ClusterBindings &CB = I.getData();
+      for (ClusterBindings::iterator CI = CB.begin(), CE = CB.end(); CI != CE;
+           ++CI) {
+        Indent(Out, Space, IsDot) << "{ " << CI.getKey() << ", \"value\": ";
+        CI.getData().printJson(Out, /*AddQuotes=*/true);
         Out << " }";
-        if (Idx != SortedBindings.size() - 1)
+        if (std::next(CI) != CE)
           Out << ',';
         Out << NL;
       }
+
       --Space;
       Indent(Out, Space, IsDot) << "]}";
-      if (Idx != SortedClusters.size() - 1)
+      if (std::next(I) != E)
         Out << ',';
       Out << NL;
     }


        


More information about the cfe-commits mailing list