如何为每个方法计算方法可能引发的异常集,包括运行时异常?

时间:2013-08-20 02:11:14

标签: java exception exception-handling soot

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

到目前为止,我完全迷失了如何使用SOOT启动它。任何人都可以给我一个第一个暗示吗?

2 个答案:

答案 0 :(得分:1)

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

干杯, 埃里克

答案 1 :(得分:-1)

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

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