Commit 7a17f197 authored by Artem Dergachev's avatar Artem Dergachev
Browse files

[analyzer] Fix hidden node traversal in exploded graph dumps.

The joined nodes now actually have the same state. That was intended
from the start but the original implementation turned out to be buggy.

Differential Revision: https://reviews.llvm.org/D69150

llvm-svn: 375278
parent 9f9151d4
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -3030,22 +3030,16 @@ struct DOTGraphTraits<ExplodedGraph*> : public DefaultDOTGraphTraits {
      llvm::function_ref<void(const ExplodedNode *)> PreCallback,
      llvm::function_ref<void(const ExplodedNode *)> PostCallback,
      llvm::function_ref<bool(const ExplodedNode *)> Stop) {
    const ExplodedNode *FirstHiddenNode = N;
    while (FirstHiddenNode->pred_size() == 1 &&
           isNodeHidden(*FirstHiddenNode->pred_begin())) {
      FirstHiddenNode = *FirstHiddenNode->pred_begin();
    }
    const ExplodedNode *OtherNode = FirstHiddenNode;
    while (true) {
      PreCallback(OtherNode);
      if (Stop(OtherNode))
      PreCallback(N);
      if (Stop(N))
        return true;

      if (OtherNode == N)
      if (N->succ_size() != 1 || !isNodeHidden(N->getFirstSucc()))
        break;
      PostCallback(OtherNode);
      PostCallback(N);

      OtherNode = *OtherNode->succ_begin();
      N = N->getFirstSucc();
    }
    return false;
  }
+24 −4
Original line number Diff line number Diff line
@@ -18,10 +18,30 @@ int foo() {
  return *x + *y;
}

// CHECK: \"program_points\": [\l&nbsp;&nbsp;&nbsp;&nbsp;\{ \"kind\": \"Edge\", \"src_id\": 2, \"dst_id\": 1, \"terminator\": null, \"term_kind\": null, \"tag\": null, \"node_id\": 1, \"is_sink\": 0, \"has_report\": 0 \}\l&nbsp;&nbsp;],\l&nbsp;&nbsp;\"program_state\": null

// CHECK: \"program_points\": [\l&nbsp;&nbsp;&nbsp;&nbsp;\{ \"kind\": \"BlockEntrance\", \"block_id\": 1

// CHECK: \"program_points\": [\l
// CHECK-SAME: \{ \"kind\": \"Edge\", \"src_id\": 2, \"dst_id\": 1,
// CHECK-SAME:    \"terminator\": null, \"term_kind\": null, \"tag\": null,
// CHECK-SAME:    \"node_id\": 1, \"is_sink\": 0, \"has_report\": 0
// CHECK-SAME: \},
// CHECK-SAME: \{ \"kind\": \"BlockEntrance\", \"block_id\": 1, \"tag\": null,
// CHECK-SAME:    \"node_id\": 2, \"is_sink\": 0, \"has_report\": 0
// CHECK-SAME: \},
// CHECK-SAME: \{ \"kind\": \"Statement\", \"stmt_kind\": \"IntegerLiteral\",
// CHECK-SAME:    \"stmt_id\": 597, \"pointer\": \"0x{{[0-9a-f]*}}\",
// CHECK-SAME:    \"pretty\": \"0\", \"location\": \{
// CHECK-SAME:        \"line\": 15, \"column\": 12, \"file\":
// CHECK-SAME:    \}, \"stmt_point_kind\": \"PreStmtPurgeDeadSymbols\",
// CHECK-SAME:    \"tag\": \"ExprEngine : Clean Node\", \"node_id\": 3,
// CHECK-SAME:    \"is_sink\": 0, \"has_report\": 0
// CHECK-SAME: \},
// CHECK-SAME: \{ \"kind\": \"Statement\", \"stmt_kind\": \"IntegerLiteral\",
// CHECK-SAME:    \"stmt_id\": 597, \"pointer\": \"0x{{[0-9a-f]*}}\",
// CHECK-SAME:    \"pretty\": \"0\", \"location\": \{
// CHECK-SAME:        \"line\": 15, \"column\": 12, \"file\":
// CHECK-SAME:    \}, \"stmt_point_kind\": \"PostStmt\", \"tag\": null,
// CHECK-SAME:    \"node_id\": 4, \"is_sink\": 0, \"has_report\": 0
// CHECK-SAME: \}
// CHECK-SAME: ]

// CHECK: \"pretty\": \"*x\", \"location\": \{ \"line\": 18, \"column\": 10, \"file\": \"{{(.+)}}dump_egraph.c\" \}