Parsing 如何通过编程将java代码(方法)解析为控制流图

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

是否有任何API或参考库可用于将java代码或java方法解析为控制流图(CFG)。 我试图将AST转换为CFG,但无法使用,但没有找到任何方法。 我正在使用EclipseIDEJava(J2SE)。
请帮忙

doSomethingA;
while(B) {
    doSomethingC;
    doSomethingD;
    if (E) {
        doSomethingF;
    }
    else {
        doSomethingG;
    }
    doSomethingH;
    doSomethingI;
}
doSomethingJ;
基本块:

  • 多索美辛加
  • 中途测试
  • doSomethingC;doSomethingD
  • doSomethingF
  • 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”语句建模;你为什么不建立一个类似的“异常返回”模型呢?