1

我正在尝试实现一个过程内分析,该分析为每个方法计算该方法可能抛出的异常集,包括通过 throw 语句显式抛出的运行时异常。

到目前为止,我完全不知道如何从 SOOT 开始。谁能给我第一个提示?

4

2 回答 2

1

您应该查看ThrowsAnalysis的实现。可以对分析进行参数化,以对哪个语句可以抛出哪些异常做出不同的假设。然而,这种分析是过程内的,也就是说,必须对方法调用做出粗略的假设。如果您想对方法调用进行精确建模,那么我建议您使用Heros进行过程间分析。

干杯,埃里克

于 2013-08-21T07:11:16.240 回答
-1
  1. 根据它们扩展或实现的内容,对源文件和 .class 文件主体中的类和接口进行索引。如果 A 扩展了 B 扩展了实现 D 的 C,则 A 应该出现在所有 B、C 和 D 的类集中。
  2. 从每个方法、初始化程序、静态初始化程序块等开始,找到它可能调用的每个构造函数或方法。创建一组调用方法,其中包括每个子类中的相应方法。如果调用 D 的get(int)方法,则必须在 A、B 和 C 中包含相应的方法。您可以使用步骤 1 中的索引找到它们。
  3. 从一个感兴趣的方法开始,例如一个或多个主要方法,形成可能直接或间接调用的所有方法和构造函数的列表。实际上,“间接调用”是步骤 2 中建立的关系的传递闭包。
  4. 检查步骤 3 的结果中每个可能调用的方法或构造函数。对于每个 throw 语句,报告操作数的类型。

如果这样做的好处证明成本是合理的,我会非常非常惊讶。

这是问题区域的一个示例。如果使用HashMap get()方法,则使用Object equals()andhashCode()方法。每个类都直接或间接扩展,因此任何或方法中Object的任何 throw 语句的参数类型都在列表中。equals()hashCode()

于 2013-08-20T02:35:03.850 回答