[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
This commit is contained in:
Artem Dergachev 2019-10-18 20:15:29 +00:00
parent 9f9151d494
commit 7a17f19709
2 changed files with 29 additions and 15 deletions

View File

@ -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;
}

View File

@ -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\" \}