我需要以编程方式检测给定方法是否返回 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/