快速业务通道

Java理论与实践:平衡测试,第2部分:编写和优化bug检测器 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
        for (String name : names)                   throwList.add(new  ExceptionThrown(name, getPC()));               }               break;             }           }         }       } catch (ClassNotFoundException e) {         bugReporter.reportMissingClass(e);       }       break;     default:        break;     }   } finally {     stack.sawOpcode(this, seen);   } }

Java理论与实践:平衡测试,第2部分:编写和优化bug检测器(4)

时间:2010-12-22 IBM Brian Goetz

汇总结果

在获得所需的关于捕获和抛出异常的信息后,最后一步是汇总这些信息。在 超类 visit(Code) 的调用返回后,将完全填充 throwList 和 caughtList 集合 。它们包含关于方法中所有 try-catch 块的信息,所以您必须将抛出信息和捕 获信息关联,以标识 bug 模式。

清单 6 显示了用于标识 RuntimeException 捕获的逻辑。它将迭代捕获块的 列表,如果发现捕获 Exception 的块,它会再次查找捕获块,该捕获块将捕获 字节码同一范围的 RuntimeException。它还可以查找在字节码的相应范围中抛 出 Exception 的实例。如果没有捕获 RuntimeException,也没有抛出 Exception,则存在一个潜在的 bug。

清单 6. 合并捕获和抛出数据,以标识 RuntimeException 捕获

for (ExceptionCaught caughtException : catchList) {    Set<String> thrownSet = new HashSet<String> ();    for (ExceptionThrown thrownException : throwList) {      if (thrownException.offset >=  caughtException.startOffset          && thrownException.offset < caughtException.endOffset)  {        thrownSet.add(thrownException.exceptionClass);        if (thrownException.exceptionClass.equals (caughtException.exceptionClass))          caughtException.seen = true;      }    }    int catchClauses = 0;    if (caughtException.exceptionClass.equals ("java.lang.Exception")     && !caughtException.seen) {      // Now we have a case where Exception is caught,  but not thrown      boolean rteCaught = false;      for (ExceptionCaught otherException : catchList) {        if (otherException.startOffset ==  caughtException.startOffset            && otherException.endOffset == caughtException.endOffset)  {          catchClauses++;          if (otherException.exceptionClass.equals ("java.lang.RuntimeException"))            rteCaught = true;        }      }      int range = caughtException.endOffset -  caughtException.startOffset;      if (!rteCaught) {        bugReporter.reportBug(new BugInstance(this,  "REC_CATCH_EXCEPTION",            NORM_PRIORITY)            .addClassAndMethod(this)            .addSourceLine(this,  caughtException.sourcePC));      }    } }

要编写 bug 检测器,则需要了解 JVM 字节码和类文件的一些结构。BCEL 和 FindBugs 库将为您处理此任务,并从字节码中提取信息,在

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号