Parsing 如何通过编程将java代码(方法)解析为控制流图
是否有任何API或参考库可用于将java代码或java方法解析为控制流图(CFG)。 我试图将AST转换为CFG,但无法使用,但没有找到任何方法。 我正在使用EclipseIDEJava(J2SE)。Parsing 如何通过编程将java代码(方法)解析为控制流图,parsing,abstract-syntax-tree,java,control-flow-graph,Parsing,Abstract Syntax Tree,Java,Control Flow Graph,是否有任何API或参考库可用于将java代码或java方法解析为控制流图(CFG)。 我试图将AST转换为CFG,但无法使用,但没有找到任何方法。 我正在使用EclipseIDEJava(J2SE)。 请帮忙 doSomethingA; while(B) { doSomethingC; doSomethingD; if (E) { doSomethingF; } else { doSomethingG; }
请帮忙
doSomethingA;
while(B) {
doSomethingC;
doSomethingD;
if (E) {
doSomethingF;
}
else {
doSomethingG;
}
doSomethingH;
doSomethingI;
}
doSomethingJ;
基本块:
- 输入->1
- 1->2
- 2->3
- 2->7
- 3->4
- 3->5
- 4->6
- 5->6
- 6->2
- 7->退出
作为数据结构,基本块具有语句列表和退出弧列表。对于某些类型的分析,用户还可以保留输入弧列表,并且可以选择使用数据结构来表示每个弧,或者简单地让块指向其他块。是的,是“代码可视化工具”您可以将它与Java Eclipse一起使用,为代码自动生成CFG:解析代码后,您就完成了最难的部分。接下来,您需要扫描语句并计算布局参数——为每个元素分配图表宽度,等等。然后再次扫描并绘制图表。不过,设计布局算法需要考虑。您是在为一个方法寻找控制流,还是想要包含跨方法调用图的内容?@HotLicks:好,但我也想将其保存为xml格式。我想知道是否有JAVA API可以这样做?@IraBaxter实际上我想为类中的所有方法生成CFG,因为我需要对其应用代码覆盖率测试。我走的方向对吗?为什么需要CFG来产生代码覆盖率?在Java中,由于每个调用站点都可能出现异常,所以“基本块”由函数调用和运算符终止,这些函数调用和运算符可能会爆炸(除法、字符串下标)。您可以构建一个更细粒度的,正如您在这里所建议的那样,但是不清楚OP是否不需要异常分支来进行彻底的测试。“finally”块作为来自非异常路径和异常路径的隐含子例程调用,会带来额外的复杂性。我怀疑匿名类由于初始化而添加了有趣的流弧。@IraBaxter-没有必要在每个可能“爆炸”的操作时终止,这样做会破坏任何优化机会(因为可能的异常非常频繁)。只需假设通过区块的流量可以在任何点终止,并直接进入捕捉点。IIRC,这可以被视为块的特殊出口,传播特殊的“模糊”位掩码,而不是从块底部退出的标准位掩码。(我写验证器已经17年了,所以我忘了细节。)细粒度控制图不会破坏优化机会;这只是意味着您必须在跟踪上执行这些操作(请参阅跟踪计划)。或者,您可以使用“模糊”退出位掩码对其进行建模,但不清楚OP是否可以生成他声称要测试的所有路径。@IraBaxter-在任何情况下,只需要对
try
范围内的块执行此操作。我想您必须对所有块执行此操作。那些不在try范围内的方法将异常控制转移到相当于该方法的特殊execption出口。您肯定会使用控制流弧对“return”语句建模;你为什么不建立一个类似的“异常返回”模型呢?