Java 理论与实践: 平衡测试,第 1 部分:不要仅编写测试,还要编写 bug 检测器
2010-01-11 00:00:00 来源:WEB开发网
清单 2. 展示 bug 模式(我们想为它构建一个检测器)的代码public class BadClass {
public void doBadStuff() {
System.gc();
}
}
清单 3 显示了运行示例类时 javap -c 的输出:
清单 3. 清单 2 中代码的字节码清单public void doBadStuff();
Code:
0: invokestatic #2; //Method java/lang/System.gc:()V
3: return
我们很快知道静态方法是通过 invokestatic JVM 指令调用的,invokestatic 的操作数是 java/lang/system 类的 gc:()V 方法。字节码中的方法签名和类型名称与源代码中的略有不同,但它很容易用于字节码使用的编码。
使用 bug 模式示例编写 FindBugs 检测器非常简单。清单 4 显示了扩展 BytecodeScanningDetector 基础类并重写 sawOpcode() 方法的检测器。当它遇到 invokestatic 指令时,它会检查被调用方法的类和名称,如果是 System.gc() 指令,它会报告 bug 实例。
清单 4. 查找调用 System.gc() 的 Bug 检测器public class CallSystemGC extends BytecodeScanningDetector {
private BugReporter bugReporter;
public CallSystemGC(BugReporter bugReporter) {
this.bugReporter = bugReporter;
}
public void sawOpcode(int seen) {
if (seen == INVOKESTATIC) {
if (getClassConstantOperand().equals("java/lang/System")
&& getNameConstantOperand().equals("gc")) {
bugReporter.reportBug(new BugInstance("SYSTEM_GC", NORMAL_PRIORITY)
.addClassAndMethod(this)
.addSourceLine(this));
}
}
}
}
更多精彩
赞助商链接