【问题标题】:How to programatically parse a java code (method) into control flow graph如何以编程方式将 Java 代码(方法)解析为控制流图
【发布时间】:2014-10-16 12:18:16
【问题描述】:

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

【问题讨论】:

  • 一旦你解析了它,你就完成了困难的部分。接下来你需要扫描语句并计算布局参数——为每个元素分配图表宽度等。然后再次扫描并绘制图表。不过,设计布局算法需要思考。
  • 您是在为 one 方法寻找 just 控制流,还是想要包含跨方法调用图的东西?
  • @HotLicks:很好,但我也想以 xml 格式保存它。我想知道天气有可用的 JAVA API 吗?
  • @IraBaxter 实际上我想为类中的所有方法生成 CFG,因为我需要对其应用代码覆盖率测试。我是否朝着正确的方向前进?请帮忙
  • 为什么需要 CFG 来产生代码覆盖率?

标签: parsing abstract-syntax-tree java control-flow-graph


【解决方案1】:
doSomethingA;
while(B) {
    doSomethingC;
    doSomethingD;
    if (E) {
        doSomethingF;
    }
    else {
        doSomethingG;
    }
    doSomethingH;
    doSomethingI;
}
doSomethingJ;

基本块:

  1. 做某事A;
  2. 测试时
  3. 做某事C; doSomethingD;
  4. doSomethingF;
  5. 做某事G;
  6. 做某事H; doSomethingI;
  7. 做某事J;

弧线:

  • 条目 -> 1
  • 1 -> 2
  • 2 -> 3
  • 2 -> 7
  • 3 -> 4
  • 3 -> 5
  • 4 -> 6
  • 5 -> 6
  • 6 -> 2
  • 7 -> 退出

作为一种数据结构,基本块具有语句列表和退出弧列表。对于某些类型的分析,人们还可以保留入口弧的列表,并且可以选择具有表示每个弧的数据结构,或者只是让块指向其他块。

【讨论】:

  • 在 Java 中,“基本块”被函数调用和可能崩溃的运算符(除法、字符串下标)终止,因为每个调用站点都可能出现异常。您可以按照您在此处的建议构建一个更细粒度的,但不清楚 OP 是否不需要异常分支来进行彻底的测试。 “finally”块还有其他复杂性,它们充当来自非异常和异常路径的隐含子例程调用。我怀疑匿名类由于初始化而添加了有趣的流弧。
  • @IraBaxter - 没有必要在每个可能“崩溃”的操作处终止,这样做会破坏优化的任何机会(因为可能的异常非常频繁)。只需假设流过该块的流可以在任何点终止,并直接进入catch点。 IIRC,这可以被视为传播特殊“模糊”位掩码的块的特殊出口,而不是退出块底部的标准位掩码。 (我写验证器已经17年了,所以我忘记了细节。)
  • 细粒度控制图不会破坏优化机会;这只是意味着您必须通过 traces 来执行它们(请参阅跟踪调度)。或者,您可以使用“模糊”退出位掩码对其进行建模,但是不清楚 OP 是否可以生成他声称要测试的所有路径。
  • @IraBaxter - 无论如何,只需要对明显在try 范围内的块执行此操作。
  • 我认为你必须对所有块都这样做。那些不在 try 范围内的异常控制转移到相当于该方法的特殊执行出口的情况。你肯定会用控制流弧来模拟一个“return”语句;为什么不类似地模拟“异常返回”?
【解决方案2】:

是的,是“代码可视化器”,您可以将它与 Java Eclipse 一起使用,为代码自动生成 CFG:https://marketplace.eclipse.org/content/control-flow-graph-factory

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2011-04-06
    • 1970-01-01
    • 2023-01-20
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多