原始问题:给定一个方法,我想确定返回的对象是否是在该方法的执行过程中创建的。我可以或应该使用哪种静态分析?
重新设计的问题:给定一个方法,我想确定该方法是否可以返回在该方法中创建的对象。因此,如果我将该方法中返回类型的所有实例都添加到一个集合中,是否有一个分析可以告诉我,对于该集合的每个成员,它是否可以返回。此外,是否可以不将集合限制为单个方法,而是将原始方法调用的所有方法限制为委托(delegate)?
这并不特定于任何调用。
看起来方法逃逸分析可能就是答案。
感谢大家的建议。
最佳答案
如果您对任何调用感兴趣并且仅当方法本地 new 创建该值时,您的问题似乎是一个简单的“到达”分析(“新值是否到达返回语句”)。如果您需要知道任何调用是否可以从任何子计算返回新值,您需要计算可能的调用图并确定任何被调用函数是否可以返回新值,或将新值从被调用函数传递到其父函数。
Java 静态分析框架有很多。
SOOT是一个基于字节码的分析框架。您可能可以使用它来实现静态查询。
DMS Software Reengineering Toolkit是用于构建自定义分析器和转换工具的通用引擎。它有一个完整的 Java 前端,并在源代码上计算各种有用的基础分析(定义/使用链、调用图)。它可以处理类文件,但目前只能获取类型信息。
如果您想要进行动态分析,无论是单独进行还是作为加强静态分析的一种方式,DMS 都可以通过插入代码来跟踪分配来以任意方式检测源代码。
关于java - 如何识别返回的对象是否是在方法执行期间创建的 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3169830/