WEB开发网
开发学院软件开发Java Java 理论与实践: 平衡测试,第 1 部分:不要仅编... 阅读

Java 理论与实践: 平衡测试,第 1 部分:不要仅编写测试,还要编写 bug 检测器

 2010-01-11 00:00:00 来源:WEB开发网   
核心提示: 清单 2. 展示 bug 模式(我们想为它构建一个检测器)的代码publicclassBadClass{publicvoiddoBadStuff(){System.gc();}}清单 3 显示了运行示例类时 javap -c 的输出: 清单 3. 清单 2 中代码的字节码清单publicvoid


清单 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)); 
      } 
    } 
  } 
} 

上一页  1 2 3 4 5 6  下一页

Tags:Java 理论 实践

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接