我正在尝试实现一个过程内分析,该分析为每个方法计算该方法可能引发的一组异常,包括通过throw语句显式引发的运行时异常。
到目前为止,我完全不知道如何从SOOT开始。有人能给我第一个提示吗?
您应该看看ThrowsAnalysis的实现。可以对分析进行参数化,以对哪个语句可以引发哪些异常做出不同的假设。然而,这种分析是过程内的,即必须对方法调用做出粗略的假设。如果您想精确地对方法调用建模,那么我建议您使用Heros进行过程间分析。
干杯,Eric
- 根据扩展或实现的内容,为源文件和.class文件体中的类和接口编制索引。如果A扩展了B,而B扩展了实现D的C,则A应该出现在B、C和D的所有类的集合中
- 从每个方法、初始化器、静态初始化器块等开始,找到它可能调用的每个构造函数或方法。创建一组被调用的方法,其中包括每个子类中的相应方法。如果调用D的
get(int)
方法,则必须在A、B和C中包含相应的方法。您可以使用步骤1中的索引找到它们 - 从感兴趣的方法开始,例如一个或多个主方法,形成可以直接或间接调用的所有方法和构造函数的列表。实际上,"间接调用"是步骤2中建立的关系的传递闭包
- 在步骤3的结果中检查每个可能调用的方法或构造函数。对于每个throw语句,报告操作数的类型
如果能从中获得好处来证明成本是合理的,我会非常、非常惊讶。
这是一个问题领域的例子。如果使用HashMap
get()
方法,则使用Object
equals()
和hashCode()
方法。每个类都直接或间接地扩展Object
,因此任何equals()
或hashCode()
方法中的任何throw语句的参数类型都在列表中。