【问题标题】:Alias Analysis in JavaJava中的别名分析
【发布时间】:2012-01-12 08:42:02
【问题描述】:

有人能指出一个框架或 Java 别名分析的实现吗? 我查看了asm框架,但它只提供数据流分析和控制流分析。

更新:只是好奇,但有人知道 Findbugs 是否进行别名分析吗?

【问题讨论】:

    标签: java optimization compiler-construction code-analysis java-bytecode-asm


    【解决方案1】:

    我知道三个带有 Java 别名分析的开源程序分析框架:

    1. WALA(免责声明:我是 WALA 维护者)。
    2. Soot
    3. Chord

    请注意,在这些框架中实际实现的是points-to analysis,通过它可以确定可能的别名。有关 WALA 指针分析的一些详细信息,请访问http://wala.sourceforge.net/wiki/index.php/UserGuide:PointerAnalysis

    【讨论】:

    • 好奇 Wala 与 Soot 和 Chord 有何不同
    • @pdeva Soot 可以生成优化的字节码,而 WALA 没有代码生成。 WALA 为跨过程数据流分析提供了良好的基础设施,我不确定是否在 Soot 中。我真的不知道Chord,所以我不确定它有什么不同。如果您有想要在 WALA 中实施的具体分析并有疑问,可以通过电子邮件发送 WALA 邮件列表或向我寻求帮助。
    • 在我看来,WALA 使用 SSA 格式作为其程序表示,而 Soots 的主要格式是 Jimple,它是一种非 SSA 三地址格式(但有另一种 SSA 格式可用)。跨度>
    【解决方案2】:

    我认为这是一个非常重要的问题,因为指向分析/别名分析是大多数程序分析任务的基本部分。因此,这是我对 Java 框架更完整列表的尝试。有些比其他更完整,这是一个活跃的研究领域,所以我可能错过了一些。很难说哪种实现最好,但 DOOP 和 SPARK 似乎是学术界的热门选择。

    1. Soot (SPARK)
      • 在 PADDLE 之前发布,但仍被 Soot 社区积极使用。 SPARK 已完全集成到 Soot 中,并且在上下文不敏感分析方面表现出色。
      • 论文:[1]
      • 资源:[1][2]
    2. Soot (PADDLE)
      • 于 2005-2008 年发布。 Soot 包括 PADDLE 的 frontend 接口,但不包括 backend。该项目不再维护(我无法让它与最新版本的 Soot 一起运行)。支持基于 BDD 的集合表示和上下文敏感性的多种抽象,以便在 Soot 中进行分析。
      • 论文:[1][2][3][4]
      • 资源:[1]
    3. bddbddb
      • 一种基于数据记录的声明性规范,可将分析转换为基于 BDD 的高效操作。
      • 论文:[1][2]
      • 资源:[1]
    4. CHORD
      • CHORD 为上下文和上下文不敏感分析提供了多种标准指向分析选项。
      • 资源:[1][2]
    5. WALA
      • WALA 实现了过程间分布式环境 (IDE) 数据流算法。
      • 论文:[1]
      • 资源:[1][2]
    6. DOOP
      • 在 MIT 许可下发布的基于声明性 Datalog 的实现,但需要专有的 LogicBlox Datalog 框架。我相信这个项目目前声称是可用的最快和最通用的框架。它也是一个非常活跃的项目,并在研究界得到广泛采用。
      • 论文:[1][2][3][4][5]
      • 资源:[1][2][3][4]
    7. Atlas (Points-to Toolbox)
      • 2016 年发布我自己Atlas 的简单安徒生式指向分析。
      • Points-To Toolbox 在 MIT 许可下发布,但需要专有的 Atlas 框架。
      • 资源:[1]
    8. SCUBA
      • 基于约束的求解器,用于上下文相关的指向分析。
      • 论文:[1]

    用于处理第三方库的额外补充工具。

    1. Averroes
      • 生成第三方库的 Java 字节码摘要。
      • 论文:[1], [2]
      • 资源:[1]
    2. Flow Miner
      • 生成第三方库的流和属性的 XML 摘要。
      • 论文:[1]
      • 资源:[1]

    【讨论】:

      【解决方案3】:

      一种可能性是Sawja,在 OCaml 中实现。它似乎还没有包含别名分析,但它提供了构建模块。

      关于您的更新,Bill Pugh's Google talk 听起来像是 Findbugs 在代码中查找特定模式而不解析指针。当然,那是在 2006 年,所以谁知道从那以后发生了什么……时间过得真快。

      【讨论】:

        【解决方案4】:

        我在 OOPSLA 上看到了 doop,但我不知道它处于什么状态。

        我不知道其他的实现,只有大量的论文。

        【讨论】:

        • DOOP 似乎是目前最先进的解决方案之一。我将添加指向他们 2015 PLDI 会议教程材料 (plast-lab.github.io/doop-pldi15-tutorial) 的链接,其中包含一些设置建议和示例。我能够在一天内成功设置 DOOP 并进行一些实验。
        【解决方案5】:

        我们的DMS Software Reengineering Toolkit 和它的Java Front End 可以用来构建它。

        DMS 提供通用解析、树/符号表构建和流分析(控制流、数据流、指向、调用图等)功能。通过将前端连接到这台机器,人们可以实施特定语言的分析,而无需从头开始构建大部分机器。这些已被用于在非常大的 C 应用程序上进行全局指向分析和调用图构建,以及在 C++ 上进行控制流分析。

        对于 Java,我们实现了方法本地控制流和本地数据流的某些方面。要做好别名分析,您需要填写调用图构造。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-02
          • 2012-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多