APP下载

基于Eclipse的Find Bugs插件的研究与设计

2022-01-14赵彦红

科学与信息化 2022年1期
关键词:源代码插件静态

赵彦红

通号工程局集团北京研究设计实验中心有限公司 北京 100070

引言

随着近来软件行业的迅猛发展,以及人们对软件需求的日益增长,软件的质量越来越成为人们关注的对象,保证软件质量的途径有两种:一种是设计阶段尽量避免缺陷,另一种就是软件开发完成后的测试。软件的测试按功能性可分为白盒测试、黑盒测试和灰盒测试;从是否执行程序角度可分为动态测试和静态测试。本文主要研究的是静态测试,静态测试不实际运行软件,主要对软件的编程格式、结构等方面进行评估。静态测试包括代码规范性检查、静态结构分析和代码质量检查等,可人工完成,也可借助软件工具进行。静态分析工具能自动找出代码中已有的缺陷[1]。好的静态分析工具是测试过程中不可或缺的利器,可在短时间内通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,可能出现的空指针引用等[2]。

1 基于Eclipse的Find Bugs插件

1.1 什么是Eclipse插件

Eclipse是一款开源的基于java的可扩展开发平台。开源性决定了任何人都可以对Eclipse实施开发插件的过程,可扩展决定了java功能的可完善性和易维护性。所以,Eclipse插件就是集成在Eclipse平台中的实现不同功能的工具。

1.2 Eclipse中的Find Bugs插件

Find Bugs是一个能静态分析源代码中可能会出现bug的Eclipse插件工具。它检查类文件,将字节码(bytecode存在于编译后的.class文件中)与一组缺陷模式和集成的规范进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序中对源代码进行分析。不是通过分析类文件(.class的文件) 的形式或结构来确定程序的意图,而是使用Visitor模式[3]对文件进行扫描和分析,在不改变源代码的情况下,检测出源代码中的存在的潜在性问题。

1.3 插件的功能管理

Find Bugs是由许多不同特性的JAR文件组成,这些JAR文件可以通过Eclipse运行实现自己的功能。而这些功能是可选的,所以在进行测试时,可以根据需要来选择功能。这正是Find Bugs的方便之处,也是插件开发者能够进行方便开发的前提。

2 Find Bugs插件的实现

2.1 开发流程

开发流程图如下:

图1 开发流程图

2.2 需求分析和功能定位

进行Java开发过程中,Eclipse的使用是不可避免的,而基于Eclipse的Find Bugs插件在前期能够减少代码出现错误和避免不好的编码习惯。

Find Bugs将检测到的错误分为以下几类:Bad practice,Correctness,Internationalization,Malicious code vulnerability,Multithreaded correctness,Performance,Dodgy code,Security,Experimental。可见Find Bugs插件不仅是检查代码的漏洞和错误,还会检查代码的书写习惯、安全性能、多线程以及国际通用性等问题。

本文设计的插件就是属于Find Bugs中的Bad practice,本文所开发的插件主要检查Java代码中空的try/catch块。众所周知,异常检测在Java开发中是一个重要的环节,其语句如下:

其中try语句用来捕获异常,而catch语句用来打印异常信息。异常信息对于Java代码的调试非常重要,如果不输出异常信息,Java检测机制不会报错,代码本身也没有错,这样会产生一种情况:当代码出现可以被捕获的错误后,无法知道这种错误是什么和这种错误出现的具体位置。所以,本文阐述的插件功能属于Find Bugs中bad practice一类。

2.3 数据结构和功能的实施

本文设计中,使用了Hashmap数据结构,Hashmap用来存储键值对,key值为Java源代码中的方法名称,而value值则为byte code中象征catch内容为空的标志关键字。例如,本文中我们将要存储的方法名或关键字用形参mName(方法的名称)来代替,对应在字节码中相应的value有不同的值,我们用统一的形参seen代替,实现语句如下:

正常情况下的程序,也就是有异常但catch块不为空,被处理的情况下的字节码如下:

对比以上两段代码可以观察到,第一段中的第11行astore_1将byteArray调用完成后直接返回,没有经过异常处理机制,即未经过catch块。第二段中第8行经过astore_1后,进行了异常处理函数的调用,其指令为第11行的invokevitual。所以,这将成为我们检测空的catch块的一种实施方案。部分源代码如下:

2.4 设计模式

由于Find Bugs是一款静态分析工具,并且集成了不同检测功能的插件,所以要想将本文中的功能集成到Find Bugs中去,最好的办法就是应用visitor设计模式。

Visitor模式的主要作用就是在不改变现有类的情况下,向其中添加新的方法。其序列图如下:

图2 visitor设计模式的序列图

具体实现的部分源代码如下:

3 性能分析

完成插件的开发后会生成.jar文件,把.jar文件添加到Find Bugs插件中,再次重启Eclipse可以看到在Find Bugs中已有新添加的插件。将Find Bugs新的插件应用在测试用例上会看到,新的插件给出了错误的具体位置以及错误信息,如下图:

图3 新插件运行在测试用例中的效果

整个过程用时1.15s,可以说是比较快,如果和其他插件功能同时运行,基本上不会增加Find Bugs的运行负担。

4 结束语

本文介绍了基于Eclipse的Find Bugs插件的开发,重点介绍了对检测空的catch块功能的研究与开发。由于Eclipse是一款开源平台,所有基于Eclipse插件的开放性为广大的开发者提供了良好的开发平台,使开发者可以在遵循JVM规则的基础之上,对必要的以及感兴趣的功能做尝试性开发。本文就是在充分了解JVM规则、Find Bugs运行机制以及已存在的Find Bugs插件基础上,对Find Bugs中检测空catch块的功能进行了弥补和尝试性的开发,并得到了预期的效果。

猜你喜欢

源代码插件静态
最新进展!中老铁路开始静态验收
静态随机存储器在轨自检算法
基于TXL的源代码插桩技术研究
自编插件完善App Inventor与乐高机器人通信
基于OSGi的军用指挥软件插件机制研究
基于语法和语义结合的源代码精确搜索方法
基于jQUerY的自定义插件开发
解密别克安全“源代码”
油罐车静态侧倾稳定角的多体仿真计算
插件体系结构软件的原理和实现