我有一张有向图。我想知道节点N是否总是在上层节点T的路径中。我检查它的方法是从入口节点开始并执行深度优先搜索。如果在任何路径中看到节点N在节点T之前遇到,则假定它不总是在其路径中。
例如,在附加图像中,入口节点为entry_0_CC_FC
,上层节点为if_end_0_CC_FC
,节点N为land.lhs.true26_0_CC_FC
。
但是我发现我的算法陷入无限循环。无论是花费太多时间还是卡住,我都不确定。顺便提一下,此图中有119个块。这是代码。你能看到任何可能导致它陷入无限循环的问题。
void CheckIfNotAlwaysInPath(bool& violation, BasicBlock* BS,
BasicBlock* BT, BasicBlock* BN, set<BasicBlock*> visited)
{
int i;
// If already visited
if ( visited.find( BS ) != visited.end() ) // If already had visited
return;
visited.insert(BS);
if ( BS == BN )
{
if ( visited.find( BT ) == visited.end() )
violation = true;
return;
}
if ( isa<ReturnInst>(BS->getTerminator()) )
return;
if ( BS->getTerminator()->getNumSuccessors() == 0 )
return;
for( i = 0; i < BS->getTerminator()->getNumSuccessors(); i++ )
{
if ( visited.find( BS->getTerminator()->getSuccessor(i) ) == visited.end() )
CheckIfNotAlwaysInPath(violation, BS->getTerminator()->getSuccessor(i), BT, BN, visited);
}
}
答案 0 :(得分:0)
检查图表中的反馈。然后在代码中检查引用功能块/状态机。 图表的上半部分直到if.end531_0_CC_FC应该没问题。 之后for.body块或for.cond675.loopexit_0_cc_FC可能容易出错......或者其他一些环回。
我的第一个猜测是从for.cond675.loopexit_0_cc_FC到for.body.688.lr.ph_0_CC_FC的环回。