From f98fe8f5d054a110360514ca2a8aa1879006b8fe Mon Sep 17 00:00:00 2001 From: clingfei <1599101385@qq.com> Date: Wed, 26 Jun 2024 01:50:49 +0000 Subject: [PATCH] fix mis-traversal on addrvars caused by iterator invalidation in connectFormalInTreeWithAddrVars --- src/ProgramDependencyGraph.cpp | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/ProgramDependencyGraph.cpp b/src/ProgramDependencyGraph.cpp index 025b09c..d295b05 100644 --- a/src/ProgramDependencyGraph.cpp +++ b/src/ProgramDependencyGraph.cpp @@ -277,29 +277,40 @@ void pdg::ProgramDependencyGraph::connectFormalInTreeWithAddrVars( while (!node_queue.empty()) { TreeNode *current_node = node_queue.front(); node_queue.pop(); - TreeNode *parent_node = current_node->getParentNode(); - std::unordered_set parent_node_addr_vars; + std::queue workqueue; + std::unordered_set isVisited; + TreeNode* parent_node = current_node->getParentNode(); + std::unordered_set parent_node_addr_vars; if (parent_node != nullptr) parent_node_addr_vars = parent_node->getAddrVars(); for (auto addr_var : current_node->getAddrVars()) { - if (!_PDG->hasNode(*addr_var)) + if (!_PDG->hasNode(*addr_var)) continue; - auto addr_var_node = _PDG->getNode(*addr_var); + auto addr_var_node = _PDG->getNode(*addr_var); + workqueue.push(addr_var_node); + } + while (!workqueue.empty()) { + auto addr_var_node = workqueue.front(); + workqueue.pop(); + if (isVisited.find(addr_var_node) != isVisited.end()) + continue; + isVisited.insert(addr_var_node); current_node->addNeighbor(*addr_var_node, EdgeType::PARAMETER_IN); - auto alias_nodes = - addr_var_node->getOutNeighborsWithDepType(EdgeType::DATA_ALIAS); - for (auto alias_node : alias_nodes) { - Value *alias_node_val = alias_node->getValue(); + auto alias_nodes = addr_var_node->getOutNeighborsWithDepType(EdgeType::DATA_ALIAS); + for (auto alias_node : alias_nodes) + { + Value* alias_node_val = alias_node->getValue(); if (alias_node_val == nullptr) continue; - if (parent_node_addr_vars.find(alias_node_val) != - parent_node_addr_vars.end()) + if (parent_node_addr_vars.find(alias_node_val) != parent_node_addr_vars.end()) continue; current_node->addNeighbor(*alias_node, EdgeType::PARAMETER_IN); + workqueue.push(alias_node); } } - for (auto child_node : current_node->getChildNodes()) { + for (auto child_node : current_node->getChildNodes()) + { node_queue.push(child_node); } }