版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 10/104种代码扫描工具分析 简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有4 种主流Java 静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。 引言 在Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。Java 静态代码分析(static code analysis)工具能够在代码构建过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性
2、并节省软件开发和测试成本。目前市场上的Java 静态代码分析工具种类繁多且各有千秋,因此本文将分别介绍现有4 种主流Java 静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest),并从功能、特性等方面对它们进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。 静态代码分析工具简介 什么是静态代码分析 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。 在软件开
3、发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。 但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。 静态代码分析工具的优势 1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。 2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。 3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性
4、并节省软件开发和测试成本。 Java 静态代码分析理论基础和主要技术 ?缺陷模式匹配:缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软 件的安全分析。这种方式的优点是简单方便,但是要求内置足够多缺陷模 式,且容易产生误报。 ?类型推断:类型推断技术是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。这种技术首先将预定义一套类型机制,包括类型等价、类型包含等推理规则,而后基于这一规则进 行推理计算。类型推断可以检查代码中的类型错误,简单,高效,适合代码缺陷的快速检测。 ?模型检查:模型检验建立于有限状
5、态自动机的概念基础之上,这一理论将被分析代码抽象为一个自动机系统,并且假设该系统是有限状态的、或者 是可以通过抽象归结为有限状态。模型检验过程中,首先将被分析代码 中的每条语句产生的影响抽象为一个有限状态自动机的一个状态,而后通过分析有限状态机从而达到代码分析的目的。模型检验主要适合检验程 序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。 ?数据流分析:数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情 况。对数据流进行分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只
6、赋值无引用等。 数据流分析主要适合检验程序中的数据域特性。 现有主流Java 静态分析工具 Checkstyle Checkstyle 是SourceForge 的开源项目,通过检查对代码编码格式,命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范。 Checkstyle 提供了支持大多数常见IDE 的插件,文本主要使用Eclipse 中的Checkstyle 插件。如下图1 所示,Checkstyle 对代码进行编码风格检查,并将检查结果显示在Problems 视图中。图中,代码编辑器中每个放大镜图标表示一个Checkstyle 找到的
7、代码缺陷。开发人员可通过在Problems 视图中查看错误或警告详细信息。 图1. 使用Checkstyle 进行编码风格检查 此外,Checkstyle 支持用户根据需求自定义代码检查规范,在下图2 中的配置面板中,用户可以在已有检查规范如命名约定,Javadoc,块,类设计等方面的基础上添加或删除自定义检查规范。 图2. 使用Checkstyle 添加自定义代码检查规范 FindBugs FindBugs 是由马里兰大学提供的一款开源Java 静态代码分析工具。FindBugs 通过检查类文件或JAR 文件,将字节码与一组缺陷模式进行对比从 而发现代码缺陷,完成静态代码分析。FindBug
8、s 既提供可视化UI 界面,同时也可以作为Eclipse 插件使用。文本将主要使用将FindBugs 作为Eclipse 插件。在安装成功后会在eclipse 中增加FindBugs perspective,用户可以对指定Java 类或JAR 文件运行FindBugs,此时FindBugs 会遍历指定文件,进行静态代码分析,并将代码分析结果显示在FindBugs perspective 的bugs explorer 中,如下图3 所示: 图3. 使用FindBugs 进行静态代码分析 图中Bug Explorer 中的灰色图标处为Bug 类型,每种分类下红色图标表示bug 较为严重,黄色的图标
9、表示bug 为警告程度。Propreties 列出了bug 的描述信息及修改方案。 此外,FindBugs 还为用户提供定制Bug Pattern 的功能。用户可以根据需求自定义FindBugs 的代码检查条件,如下图4 所示: 图4. 使用FindBugs 添加自定义代码检查规范 PMD PMD 是由DARPA 在SourceForge 上发布的开源Java 代码静态分析工具。PMD 通过其内置的编码规则对Java 代码进行静态检查,主要包括对潜在的bug,未使用的代码,重复的代码,循环体创建新对象等问题的检验。PMD 提供了和多种Java IDE 的集成,例如Eclipse,IDEA,Ne
10、tBean 等。本文主要使用PMD 以插件方式与Eclipse 集成。如下图5 所示:在Violations Overview 视图中,按照代码缺陷严重性集中显示了PMD 静态代码分析的结果。 图5. 使用PMD 进行静态代码分析 PMD 同样也支持开发人员对代码检查规范进行自定义配置。开发人员可以在下图6 中的面板中添加、删除、导入、导出代码检查规范。 图6. 使用PMD 添加自定义代码检查规范 Jtest Jtest 是Parasoft 公司推出的一款针对Java 语言的自动化代码优化和测试工具,Jtest 的静态代码分析功能能够按照其内置的超过800 条的Java 编码规范自动检查并纠正
11、这些隐蔽且难以修复的编码错误。同时,还支持用户自定义编码规则,帮助用户预防一些特殊用法的错误。Jtest 提供了基于Eclipse 的插件安装。Jtest 支持开发人员对Java 代码进行编码规范检查,并在Jtask 窗口中集中显示检查结果,如下图7 所示: 图7. 使用Jtest 进行静态代码分析 同时,Jtest 还提供了对用户定制代码检查配置甚至自定义编码规则的支持,这一功能使得开发人员可以基于不同场景定制所需要的编码规范,如图8 所示: 图8. 使用Jtest 添加自定义代码检查规范 Java 静态分析工具对比 本章节将从以下几个方面对上述Java 静态分析工具进行比较:应用技术及分析
12、对象 下表1 列出了不同工具的分析对象及应用技术对比: 表1. 不同工具的分析对象及应用技术对比 Java 静态分析工具分析对象应用技术Checkstyle Java 源文件缺陷模式匹配 FindBugs 字节码缺陷模式匹配;数据流分析 PMD Java 源代码缺陷模式匹配 Jtest Java 源代码缺陷模式匹配;数据流分析 内置编程规范 Checkstyle: ?Javadoc 解释:检查类及方法的Javadoc 解释 ?命名约定:检查命名是否符合命名规范 ?标题:检查文件是否以某些行开头 ?Import 语句:检查Import 语句是否符合定义规范 ?代码块大小,即检查类、方法等代码块的
13、行数 ?空白:检查空白符,如tab,回车符等 ?修饰符:修饰符号的检查,如修饰符的定义顺序 ?块:检查是否有空块或无效块 ?代码问题:检查重复代码,条件判断,魔数等问题 ?类设计:检查类的定义是否符合规范,如构造函数的定义等问题FindBugs: ?Bad practice 坏的实践:常见代码错误,用于静态代码检查时进行缺陷模式匹配 ?Correctness 可能导致错误的代码,如空指针引用等 ?国际化相关问题:如错误的字符串转换 ?可能受到的恶意攻击,如访问权限修饰符的定义等 ?多线程的正确性:如多线程编程时常见的同步,线程调度问题。 ?运行时性能问题:如由变量定义,方法调用导致的代码低效问
14、题。 PMD: ?可能的Bugs:检查潜在代码错误,如空try/catch/finally/switch 语句?未使用代码(Dead code):检查未使用的变量,参数,方法 ?复杂的表达式:检查不必要的if 语句,可被while 替代的for 循环?重复的代码:检查重复的代码 ?循环体创建新对象:检查在循环体内实例化新对象 ?资源关闭:检查Connect,Result,Statement 等资源使用之后是否被关闭掉 Jtest ?可能的错误:如内存破坏、内存泄露、指针错误、库错误、逻辑错误和算法错误等 ?未使用代码:检查未使用的变量,参数,方法 ?初始化错误:内存分配错误、变量初始化错误、变
15、量定义冲突 ?命名约定:检查命名是否符合命名规范 ?Javadoc 解释:检查类及方法的Javadoc 解释 ?线程和同步:检验多线程编程时常见的同步,线程调度问题 ?国际化问题: ?垃圾回收:检查变量及JDBC 资源是否存在内存泄露隐患 错误检查能力 为比较上述Java 静态分析工具的代码缺陷检测能力,本文将使用一段示例代码进行试验,示例代码中将涵盖我们开发中的几类常见错误,如引用操作、对象操作、表达式复杂化、数组使用、未使用变量或代码段、资源回收、方法调用及代码设计几个方面。最后本文将分别记录在默认检查规范设置下,不同工具对该示例代码的分析结果。以下为示例代码Test.java。其中,代码
16、的解释部分列举了代码中可能存在的缺陷。 清单1. Test.java 示例代码 view source print? package Test; 1 import java.io.*; 2 public class Test 3 /* 4 * Write the bytes from input stream to output stream. 5 * The input stream and output stream are not closed. 6 07 * param is 08 * param os 9 * throws IOException 1 */ 1 1 public bo
17、olean copy(InputStream is, OutputStream os) throws IOException 1 2 int count = 0; 1 3 /缺少空指针判断 1 4 byte buffer = new byte1024; 1 5 while(count = is.read(buffer) = 0) 1 6 os.write(buffer, 0, count); 1 7 1 8 /未关闭I/O流 1 9 return true; 2 2 1 /* 2 2 * 23 * param a 24 * param b 2 5 * param ending 2 6 * re
18、turn copy the elements from a to b, and stop when meet element ending 2 7 */ 2 public void copy(String a, String b, String ending) 8 2 9 3 int index; 3 String temp = null; 1 3 /空指针错误 2 3 System.out.println(temp.length(); 3 3 /未使用变量 4 3 int length=a.length; 5 3 for(index=0; index index+) 6 3 7 3 /多余的
19、if语句 8 3 if(true) 9 4 4 /对象比较应使用equals 1 4 if(temp=ending) 2 4 3 4 break; 4 4 5 4 /缺少数组下标越界检查 6 4 bindex=temp; 7 4 8 4 9 5 5 1 /* 5 2 * 5 3 * param file 5 4 * return file contents as string; null if file does not exist 5 5 */ 5 6 public void readFile(File file) 5 7 InputStream is = null; 5 8 OutputStream os = null; 5 9 try 6 0 is = new BufferedInputStream(new FileInputStream(file); 6 1 os = new ByteArrayOutputStream(); 6 2 /未使用方法返回值 6 3 copy(is,os); 6 4 is.close(); 6 5 os.close(); 6 6 catch(IOException e) 6 /可能造成I/O流未关闭 7 6 8 e.printStackTrace(); 6 9 7 finally 7 1 7 2 /空的try/catch/finally块 7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地理(广东卷01)(考试版)-2026年高考考前预测卷
- 城市服务链路融合产品定位文档
- 前端状态校验共享组件规范
- 便民服务项目运营管理规范
- 值班兽医交接清洁台账规范
- 基坑支护工程施工报价策略方案
- 医疗质量管理体系文件
- 日志采集分析管理实施方案
- 宠物柔顺洗护香波选用判断标准
- 焊接机器人故障隔离应急预案
- 组合铝合金模板工程技术规程
- 室内装修拆除施工方案 最终
- 鲁班奖机电安装工程实施手册
- 教育培训合作项目策划书范文
- 舞蹈团财务管理制度内容
- 职业卫生与职业医学 教案
- 机械识图全套课件
- 2025年江苏省南通市中考生物试卷(含答案解析)
- GB/T 3487-2024乘用车轮辋规格系列
- 管理心理学 权利与政治
- 2020国家工程设计收费标准
评论
0/150
提交评论