java - 检测返回 null 的方法的静态字节码分析工具?

标签 java null bytecode static-analysis

我需要以编程方式检测给定方法是否返回 null。

checker framework似乎能够做到这一点,但仅限于带注释的源代码。我需要它的字节码。具体来说,我需要验证如下声明:

Method x.y.Z#foo() cannot return null.

其中我只有类 x.y.Z 的字节码。

您知道有支持该功能的工具吗?

在一般情况下这可能吗?据我所知,它并不等同于停止问题,因为人们不需要找出程序的确切路径。例如在

Foo bar() {
    if (cond) { return null; } else { return new Foo(); }
}

分析工具不需要关心cond ,只要注意到在所有可能路径中的至少一个中 null 就足够了返回,因此 bar 不能返回 null 的声明可以被拒绝。

注意:我会接受误报,例如 cond可能只是 false并且分析工具仍然可以声称 bar() 可以返回 null(这相当于说我们无法在一般情况下证明 cond 一定为真)。

最佳答案

我不知道有什么工具可以做到这一点,但如果误报是可以接受的,那么我认为这是可能的。

从方法返回的值最终将来自以下之一

  • 方法内的常量
  • 提供的参数
  • 一个字段
  • 另一个java方法调用的结果
  • 原生调用的结果
  • 构造函数调用
  • 一个我已经忘记的来源

如果您假设任何字段或参数可能为 null,并且任何 native 调用都可能返回 null,则可以将每个方法标记为可能返回 null,如果

  • 该方法的流程可以返回空常量
  • 方法流程可以返回一个字段
  • 方法流程可以返回一个参数值
  • 方法流程可以返回原生调用的结果
  • 方法的流程可以从本身可以返回 null 的方法返回一个值

但是,它可能没有用,因为它可能会产生很高比例的误报(您必须有一些可接受的最大百分比,否则您可以使用仅返回 true 的方法来满足您的要求)。

您也许可以添加额外的启发式方法来减少被视为空的字段/参数/方法的数量。

ASM 树 api 提供了您尝试和实现此功能所需的所有构建 block ,包括流分析。

关于java - 检测返回 null 的方法的静态字节码分析工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18147058/

相关文章:

java - 检查一行是否以列表中的内容开头

c - c 中的 null 类型和编译器错误

java - 如何在抽象类中使用在抽象类的子类中创建的对象

javascript - 对象属性为 null,但输入的值不是 null。如何正确插入值?

python - 字节编译 Python 平台特定吗?

java - 如何在子JDialog中设置主框架

java - 通过java中的内联创建对象访问私有(private)元素

java - 手动将歌曲作为音乐轨道添加到 Mediastore

python - 有没有办法以编程方式生成 Python 字节码?

java - 选择哪个库在运行时生成类