4种代码扫描工具分析_第1页
4种代码扫描工具分析_第2页
4种代码扫描工具分析_第3页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、简介本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。引言在 JavaJava 静态代码分析(staticcodeanalysis)工具能够在代码构建过程中帮助开发人员快速、有效的定位场上的 Java 静态代码分析工具种类繁多且各有千秋,因此本文将分别介绍现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs

2、,PMD,Jtest),并从功能、特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。静态代码分析工具简介什么是静态代码分析非法计算,可能出现的空指针引用等等。在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。静态代码分析工具的优势帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。帮助代码设计人员更专注于分析和解决代码设计缺陷。显著减少在代码逐行检

3、查上花费的时间,提高软件可靠性并节省软件开发和测试成本。Java 静态代码分析理论基础和主要技术单方便,但是要求内置足够多缺陷模式,且容易产生误报。一个状态,而后通过分析有限状态机从而达到代码分析的 目的。模型检验主要适合检验程序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。后、只赋值无引用等。数据流分析主要适合检验程序中的 数据域特性。现有主流 Java 静态分析工具CheckstyleCheckstyle 是 SourceForge 的开源项目,通过检查对代码编码格式,命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范。Ch

4、eckstyle 提供了支持大多数常见 IDE 的插件,文本主要使用 Eclipse 中的 Checkstyle 插件。如下图 1 所示,Checkstyle 对代码进行编码风格检查,并将检查结果显示在 Problems 视图中。图中,代码编辑器中每个放大镜图标表示一个 Checkstyle 找到的代码缺陷。开发人员可通过在Problems 视图中查看错误或警告详细信息。图 1. 使用 Checkstyle 进行编码风格检查此外,Checkstyle 支持用户根据需求自定义代码检查规范,在下图 2 中的配置面板中,用户可c图 2. 使用 Checkstyle 添加自定义代码检查规范FindBu

5、gsFindBugs 是由马里兰大学提供的一款开源 JavaFindBugs 通过检查类文件或 JAR 文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。FindBugs 既提供可视化 UI 界面,同时也可以作为 Eclipse 插件使用。文本将主要使用将FindBugs 作为 Eclipse 插件。在安装成功后会在 eclipse 中增加 FindBugsperspective,用户可以对指定 Java 类或 JAR 文件运行 FindBugs,此时 FindBugs 会遍历指定文件,进行静FindBugsperspective 的 bugsexplorer 中,如下图

6、 3 所示:图 3. 使用 FindBugs 进行静态代码分析图中 Bug Explorer 中的灰色图标处为 Bug 类型,每种分类下红色图标表示 bug 较为严重,黄色的图标表示 bug 为警告程度。Propreties 列出了 bug 的描述信息及修改方案。此外,FindBugs 还为用户提供定制 Bug Pattern 的功能。用户可以根据需求自定义 FindBugs的代码检查条件,如下图 4 所示:图 4. 使用 FindBugs 添加自定义代码检查规范PMDPMD 是由 DARPA 在 SourceForge 上发布的开源 Java 代码静态分析工具。PMD 通过其内置的编码规则对

7、 Java 代码进行静态检查,主要包括对潜在的 bug,未使用的代码,重复的代码, 循环体创建新对象等问题的检验。PMD 提供了和多种 Java IDE 的集成,例如 Eclipse,IDEA, NetBean 等。本文主要使用 PMD 以插件方式与 Eclipse 集成。如下图 5 所示:在 Violations Overview 视图中,按照代码缺陷严重性集中显示了 PMD 静态代码分析的结果。图 5. 使用 PMD 进行静态代码分析PMD 同样也支持开发人员对代码检查规范进行自定义配置。开发人员可以在下图 6 中的面板中添加、删除、导入、导出代码检查规范。图 6. 使用 PMD 添加自定

8、义代码检查规范JtestJtest 是 Parasoft 公司推出的一款针对 Java 语言的自动化代码优化和测试工具,Jtest 的静态代码分析功能能够按照其内置的超过 800 条的 Java 编码规范自动检查并纠正这些隐蔽且难以Jtest 提供了基于 Eclipse 的插件安装。Jtest 支持开发人员对 Java 代码进行编码规范检查,并在 Jtask 窗口中集中显示检查结果,如下图 7 所示:图 7. 使用 Jtest 进行静态代码分析同时,Jtest 还提供了对用户定制代码检查配置甚至自定义编码规则的支持,这一功能使得开发人员可以基于不同场景定制所需要的编码规范,如图 8 所示:图

9、8. 使用 Jtest 添加自定义代码检查规范Java 静态分析工具对比本章节将从以下几个方面对上述 Java 静态分析工具进行比较:应用技术及分析对象下表 1 列出了不同工具的分析对象及应用技术对比:表 1. 不同工具的分析对象及应用技术对比Java 静态分析工具分析对象应用技术Checkstyle FindBugs PMDJava 源文件缺陷模式匹配字节码缺陷模式匹配;数据流分析Java 源代码缺陷模式匹配JtestJava 源代码缺陷模式匹配;数据流分析内置编程规范Checkstyle:Javadoc 注释:检查类及方法的 Javadoc 注释命名约定:检查命名是否符合命名规范标题:检查

10、文件是否以某些行开头Import 语句:检查 Import 语句是否符合定义规范代码块大小,即检查类、方法等代码块的行数空白:检查空白符,如 tab,回车符等修饰符:修饰符号的检查,如修饰符的定义顺序块:检查是否有空块或无效块代码问题:检查重复代码,条件判断,魔数等问题类设计:检查类的定义是否符合规范,如构造函数的定义等问题FindBugs:Badpractice 坏的实践:常见代码错误,用于静态代码检查时进行缺陷模式匹配Correctness 可能导致错误的代码,如空指针引用等国际化相关问题:如错误的字符串转换可能受到的恶意攻击,如访问权限修饰符的定义等多线程的正确性:如多线程编程时常见的同

11、步,线程调度问题。运行时性能问题:如由变量定义,方法调用导致的代码低效问题。PMD:可能的 Bugs:检查潜在代码错误,如空 try/catch/finally/switch 语句未使用代码(Deadcode):检查未使用的变量,参数,方法复杂的表达式:检查不必要的 if 语句,可被 while 替代的 for 循环重复的代码:检查重复的代码循环体创建新对象:检查在循环体内实例化新对象资源关闭:检查 Connect,Result,Statement 等资源使用之后是否被关闭掉Jtest可能的错误:如内存破坏、内存泄露、指针错误、库错误、逻辑错误和算法错误等未使用代码:检查未使用的变量,参数,方

12、法初始化错误:内存分配错误、变量初始化错误、变量定义冲突命名约定:检查命名是否符合命名规范Javadoc 注释:检查类及方法的 Javadoc 注释线程和同步:检验多线程编程时常见的同步,线程调度问题国际化问题:垃圾回收:检查变量及 JDBC 资源是否存在内存泄露隐患错误检查能力为比较上述 Java 静态分析工具的代码缺陷检测能力,本文将使用一段示例代码进行试验,示例规范设置下,不同工具对该示例代码的分析结果。以下为 示例代码 Test.java。其中,代码的注释部分列举了代码中可能存在的缺陷。清单 1. Test.java 示例代码view source print?p a c k a Te

13、 s t;i m p o r t j a.i o.*;puclass Te st04/*bytes from stream to output stream.The stream and stream not closed.07*p ar am is08*p ar amos* 0thro 9ws IOExc eptio n10*/public boolean 1copy(InputStream1is, OutputStreamos) throws IOException 1in2t count = 0;1/缺断byte bufferbyte1024;while(count1=5is.read(

14、buffer) = 0) os.w6rite(buffer, 0, count);171/8/未关闭I/O流19retu rn true;202/ 1*22*2p ar am a2p ar am b* param5ending*return copy 2elements from a 6b, and stop whenmeet elementending2*/7public8void copy(String a, String b, String ending)2930intinde x;temp = null;3/2空指针错误Syste3m.out.print 3ln(temp.length

15、();3/未4使用变量35intlength=a.le ngth;3x=0;6for(indeindex&a.length; index+)3738/if39if(tru e)404/equals4if(temp=ending) 4344break;454/缺6少 数组下标越界检查47bindex=t emp;4849 505/ 1*52*5* param3file*return file 5contents as4null if file doesnot exist55 */public 5 readFile(F ilefile) 5m is = null;5 am os = null;59

16、tryis =new6BufferedInputStrea 0m(newFileInputStream(fi le);o6s = new1ByteArrayOutputStream();6/2/未使用方法返回值63copy(is, os);64is.close ();65os.close();6 catch6(IOException e) 6可7I/O未关闭6e.pr8intStackTrace();6970f inall y717/空的2try/catch/finally 块73747 5通过以上测试代码,我们对已有 Java 静态代码分析工具的检验结果做了如下比较,如下表 2 所示。表 2. Java 静态代码分析工具对比代码缺陷分类示例CheckstyleFindBugsPMDJtest引用操作空指针引用对象操作对象比较(使用 = 而不是equals)表达式复杂化多余的 if 语句数组使用未使用变量或代码段数组下标越界未使用变量资源回收方法调用代码设计I/O未 关闭未使用方法返回值空 的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论