1. 软件工程 静态测试的主要方法有哪些
(1)人工检测:是指不依靠计算机而是靠人工审查程序或评审软件,包括代码检查、静态结构分析和代码质量度量等;
(2)计算机辅助静态分析:利用静态分析工具对被测试程序进行特性分析,从程序中提取一些信息,以便检查程序逻辑的各种缺陷和可疑的程序构造。
静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。
(1)二进制程序静态分析扩展阅读:
代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。
在实际使用中,代码检查比动态测试更有效率,能快速找到缺陷,发现30%~70%的逻辑设计和编码缺陷;代码检查看到的是问题本身而非征兆。但是代码检查非常耗费时间,而且代码检查需要知识和经验的积累。
代码检查应在编译和动态测试之前进行,在检查前,应准备好需求描述文档、程序设计文档、程序的源代码清单、代码编码标准和代码缺陷检查表等。静态测试具有的发现缺陷早、降低返工成本、覆盖重点和发现缺陷的概率高的优点以及耗时长、不能测试依赖和技术能力要求高的缺点。
2. 动态调试和静态调试是什么意思有什么区别
动态调试是指软件作者利用集成环境(IDE)自带的调试器跟踪自己软件的运行,来协助解决自己软件的错误。 要成为一位优秀的软件工程师,调试能力是不可或缺的。
动态调试技术在软件逆向工程领域也是一个很热门的概念,它是与静态分析技术相对而言的。静态分析技术是指破解者利用反汇编工具将二进制的可执行文件翻译成汇编代码,通过对代码的分析来破解软件;而动态调试则是指破解者利用调试器跟踪软件的运行,寻求破解的途径。
3. 什么是二进制分析
二进制分析创建了一种行为模式,该模式通过利用可运行的机器代码分析应用程序的控制和数据流得到的,是一种攻击者可以识别的方式。与源代码分析工具不同,这种方法精确地检测导致核心应用程序和覆盖范围扩展在第三方库、预包装组件、编译器或平台的具体说明引进代码的漏洞。
关于二进制分析,我要推荐Veracode的专利技术——静态二进制分析,它使企业可以在一个易于使用的平台上进行应用程序的安全诊断,作为企业正式软件的发布、验证或验收过程的一部分。这无需提供源代码或其他知识产权。
4. 什么是软件测试的静态分析
静态分析,是相对动态说的,即不运行程序。
使用的工具主要是你的眼睛,常用在文档测试、白盒测试(代码审查/走查)、UI界面测试。
静态测试,通过评审文档、阅读代码等方式测试软件称为静态测试,通过运行程序测试软件称为动态测试。
(4)二进制程序静态分析扩展阅读:
简单地说就是抽象了时间因素和具体变动的过程,静止地孤立地考察某些经济现象。它一般用于分析经济现象的均衡状态以及有关经济变量达到均衡状态所需要的条件。 常用的静态分析法有:相对数分析法、平均数分析法、比较分析法、结构分析法、因素替换分析法、综合计算分析法、价值系数分析法等。
5. 程序静态分析的分析技术及实践
程序静态分析(Program Static Analysis)可以帮助软件开发人员、质量保证人员查找代码中存在的结构性错误、安全漏洞等问题,从而保证软件的整体质量。还可以用于帮助软件开发人员快速理解文档残缺的大规模软件系统以及系统业务逻辑抽取等系统文档化等领域。 如开发20年以上的金融核心COBOL系统,动辄上千万行代码的系统规模。对于理解这样规模的系统,基于程序静态分析的辅助理解工具就能发挥积极作用。
本文首先对程序静态分析的特点、常用静态分析技术、静态分析实现方式进行描述,然后通过一个实例讲解了程序静态分析的执行过程。 程序静态分析是与程序动态分析相对应的代码分析技术,它通过对代码的自动扫描发现隐含的程序问题,主要具有以下特点:
(1)不实际执行程序。动态分析是通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄漏测试等方面。与之相反,静态分析不运行代码只是通过对代码的静态扫描对程序进行分析。
(2)执行速度快、效率高。目前成熟的代码静态分析工具每秒可扫描上万行代码,相对于动态分析,具有检测速度快、效率高的特点。
(3)误报率较高。代码静态分析是通过对程序扫描找到匹配某种规则模式的代码从而发现代码中存在的问题,例如可以定位strcpy()这样可能存在漏洞的函数,这样有时会造成将一些正确代码定位为缺陷的问题,因此静态分析有时存在误报率较高的缺陷,可结合动态分析方法进行修正。 (1)词法分析:从左至右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描,通过使用正则表达式匹配方法将源代码转换为等价的符号(Token) 流,生成相关符号列表,Lex为常用词法分析工具。
(2)语法分析:判断源程序结构上是否正确,通过使用上下文无关语法将相关符号整理为语法树, Yacc为常用工具。
(3)抽象语法树分析:将程序组织成树形结构,树中相关节点代表了程序中的相关代码,目前已有javacc/ Antlra等抽象语法树生成工具。
(4)语义分析:对结构上正确的源程序进行上下文有关性质的审查。
(5)控制流分析:生成有向控制流图,用节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环;还可生成函数调用关系图,表示函数间的嵌套关系。
(6)数据流分析:对控制流图进行遍历,记录变量的初始化点和引用点,保存切片相关数据信息。
(7)污点分析:基于数据流图判断源代码中哪些变量可能受到攻击,是验证程序输入、识别代码表达缺陷的关键。
(8)无效代码分析,根据控制流图可分析孤立的节点部分为无效代码。
程序静态分析是在不执行程序的情况下对其进行分析的技术,简称为静态分析。而程序动态分析则是另外一种程序分析策略,需要实际执行程序。大多数情况下,静态分析的输入都是源程序代码,只有极少数情况会使用目标代码。静态分析这一术语一般用来形容自动化工具的分析,而人工分析则往往叫做程序理解。
静态分析越来越多地被应用到程序优化、软件错误检测和系统理解领域。Coverity Inc.的软件质量检测产品就是利用静态分析技术进行错误检测的成功代表。国内某软件公司的闪蝶(BlueMropho)代码分析平台,是利用程序静态分析技术专注于大型机遗留系统的代码理解领域,尤其擅长分析千万行代码规模级的COBOL系统。
6. hex文件转换成C语言
文件有两种,一种是文本文件,一种是程序二进制文件,不管哪种文件都可以用十六进制编码来显示,称为hex文件。
1、文本Hex文件一般不需要转成C语言,更多的是程序二进制文件,用十六进制显示,可以转换成C语言,一般使用相应的反汇编程序来实现,这方面的工具很多,不同的平台略有不同。Windows平台一般常用的OllyDbg、Windbg、IDA,Linux平台使用最多的是GDB和Linux版的IDA。
OllyDbg,简称OD,一般是软件逆向工程爱好者,最先使用的一个工具,但是因为当下不在更新,所以一般用一般用于学习使用,下图中左上角的区域即为反汇编区域 ,用户可以根据汇编指令,分析程序算法,然后自己编写代码。
通过这个实例 ,相信应该能理解一个大致的流程啦。
7. 如何使用JVisualVM进行性能分析
1、本地机器的程序直接可以监听到
2、远程机器的程序需要加上JVM参数
-Dcom.sun.management.jmxremote=
true
-Dcom.sun.management.jmxremote.port=
9090
-Dcom.sun.management.jmxremote.ssl=
false
-Dcom.sun.management.jmxremote.authenticate=
false
备注:另外需要检查
hostname –i
看解析出来是否为本地的IP,如是127.0.0.1或者IP为多个IP中之一,则其他的IP无效,会连接不上。
这里有个分析案例,利用jvisualvm分析tomcat的问题:
http://blog.tty.nl/2010/09/03/using-visualvm-to-fix-live-tomcat-and-jvm-problems
插件安装
tools->plugin->Available Plugin 会有值得安装的插件,如:VisualGC
JConsole
插件列表:https://visualvm.dev.java.net/plugins.html
注意:上面提供的端口配置有些麻烦,不如直接这样做:
要使用 VisualGC
必须在远程机上启动jstatd代理程序,否则会显示 “not supported for this jvm” 错误
而启动 jstatd 时会有一个权限问题,需要做如下修改:
nano /opt/sun-jdk-
1.6
.
0.26
/jre/lib/security/java.policy
Java代码
nano /opt/sun-jdk-1.6.0.26/jre/lib/security/java.policy
增加下列行
Java代码
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
然后启动 jstatd并且不要关闭
如:
Threads
查看线程的运行情况,运行、停止、睡眠、等待,根据这些结合实际程序运行的逻辑分析。
找到可疑份子,可以Thread Dump 找出具体是哪个线程在作祟。
参看这个例子:http://blog.tty.nl/2010/09/03/using-visualvm-to-fix-live-tomcat-and-jvm-problems
profile
关于如何使用,如何分析程序,可以参看这个例子:http://www.baptiste-wicht.com/2010/07/profile-applications-java-visualvm/
8. 程序静态分析的著名的静态分析工具
雨田静态分析系统V2.1
产品介绍
简介
雨田静态分析系统是拥有独立知识产权的国产软件,能够对.c/.cpp文件进行静态分析。主要分析内容包括控制流分析、数据流分析、基本度量指标的计算、编码规则的违反情况检查等。在对文件进行详尽分析基础上,结合系统特有的质量模型,雨田静态分析系统对被分析的代码进行了综合质量评估,以直观的形式显示编码的质量水平。系统提供了内容丰富的静态分析结果和多角度的质量分析报告,为对编码进行有效评估提供重要的参考,也为解决代码中存在的问题提供明确的线索,进而促进软件质量得到有效地改善与提高。
特点
指标丰富
雨田静态分析系统详细计算了代码相关指标、注释信息相关指标、数据流相关指标、复杂度相关指标、循环相关指标、操作符及操作数指标、路径指标等多个方面的指标,为对代码质量进行有效的评价提供坚实的基础。
规则全面
雨田静态分析系统以MISRA为基础,结合众多c语言专家的研究成果以及多名资深c/c++开发人员的经验,提炼出了300余条可检查的质量规则,从代码的正确性、健壮性、可读性、语义唯一性、环境兼容性等多个方面对之进行详尽地检查,辅助开发及测评人员查找代码中的问题。
功能紧凑、简单易用
雨田静态分析系统力求以最简洁的方式提供最实用的分析结果。用户仅仅需要执行“打开”操作,就可以查看工程中所有源文件的度量指标、相关代码、控制流图、以及规则检查结果等重要信息。在执行一次“综合质量分析”操作,就可以查阅工程中所有源文件及其逐函数的指标汇总报告、规则检查报告、可读性报告、可维护性报告、可测试性报告以及质量评估报告等众多分析报告。
使用灵活
雨田静态分析系统允许用户选择语法分析策略、分析报告内容以及编码规则,还允许用户调整相关编码规则的边界(阀值),从而使之成为自己特定的编码规则。借助于自身具备的灵活性,雨田静态分析系统尽可能的适应用户的应用环境。
主要功能
控制流分析
通过对c语言及c++语言的顺序结构、选择结构和循环结构等类型代码块自身及相互关系的详尽分析,从而获取被测文件中每个函数及类方法对应的控制流图。通过对文件中函数间调用关系的分析,系统能够获取文件内函数间的调用关系;通过对文件中类对象的使用情况分析,可以获得文件中的类关系图。
数据流分析
系统对全局变量、类属性、函数参数、局部变量等数据载体进行了其所在的作用域内的
详尽的数据分析,对函数间的调用关系及数据传递也进行了必要的分析,从而能够以静态的视角把握文件中每个变量的数据变化过程,为后续的同数据流相关指标计算及代码质量检查打下了坚实的基础。
基本指标计算
基于对文件中代码进行分析而获取的数据,雨田静态分析系统从代码、注释、数据流、
路径、复杂度、循环、操作符及操作数等多个角度计算出相应的指标。
规则检查
系统以 MISRA编码规则为依据,系统分析了三百余条最常见的编码问题。对于检查出的问题,系统会给出问题发生的位置,原因以及对应的规则,方便用户查证并改进。
综合质量评估
通过对计算出的指标以及查找出的违反编码规则信息的分类、甄别,根据相关信息在代码综合质量中的影响程度,雨田静态分析系统从可读性、可维护性以及可测试性等三个角度对文件整体、类整体、逐函数等不同层级的代码进行了综合质量评定,并给出直观的分类评价报告及综合评价报告,
9. 静态分析是指
经济领域概念
静态分析是一种分析经济现象的均衡状态以及有关的经济变量达到均衡状态所需要条件的分析方法。[1]而不考虑经济现象达到均衡状态的过程,它完全抽象掉了时间因素和具体的变化过程,是一种静止地、孤立地考察某种经济事物的方法。
网络
静态分析
经济领域概念
静态分析是一种分析经济现象的均衡状态以及有关的经济变量达到均衡状态所需要条件的分析方法。[1]而不考虑经济现象达到均衡状态的过程,它完全抽象掉了时间因素和具体的变化过程,是一种静止地、孤立地考察某种经济事物的方法。
中文名
静态分析
外文名
static analysis
指标
总量指标、相对指标、平均指标、标志变异指标等
应用
静态计算机科学、经济学、工程、力学、机械
释义
根据既定的外生变量值求得内生变量的分析方法
内涵
静态分析法是根据既定的外生变量值求得内生变量的分析方法,是对已发生的经济活动成果,进行综合性的对比分析的一种分析方法。
如研究均衡价格时,舍掉时间、地点等因素,并假定影响均衡价格的其他因素,如消费者偏好、收入及相关商品的价格等静止不变,单纯分析该商品的供求达于均衡状态的产量和价格的决定。简单地说就是抽象了时间因素和具体变动的过程,静止地孤立地考察某些经济现象。它一般用于分析经济现象的均衡状态以及有关经济变量达到均衡状态所需要的条件。
常用的静态分析法有:相对数分析法、平均数分析法、比较分析法、结构分析法、因素替换分析法、综合计算分析法、价值系数分析法等。
指标
10. 做静态代码分析都是用那个软件的
本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。
引言
在 Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。Java 静态代码分析(static code analysis)工具能够在代码构建过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省软件开发和测试成 本。目前市场上的 Java 静态代码分析工具种类繁多且各有千秋,因此本文将分别介绍现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),并从功能、特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。
静态代码分析工具简介
什么是静态代码分析
静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。
在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。
但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。
静态代码分析工具的优势
1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。
2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。
3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。
Java 静态代码分析理论基础和主要技术
缺陷模式匹配:缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。这种方式的优点是简单方便,但是要求内置足够多缺陷模式,且容易产生误报。
类型推断:类型推断技术是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。这种技术首先将预定义一套类型机制,包括类 型等价、类型包含等推理规则,而后基于这一规则进行推理计算。类型推断可以检查代码中的类型错误,简单,高效,适合代码缺陷的快速检测。
模型检查:模型检验建立于有限状态自动机的概念基础之上,这一理论将被分析代码抽象为一个自动机系统,并且假设该系统是有限状态的、或者是可以通过抽象归 结为有限状态。模型检验过程中,首先将被分析代码中的每条语句产生的影响抽象为一个有限状态自动机的一个状态,而后通过分析有限状态机从而达到代码分析的 目的。模型检验主要适合检验程序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。
数据流分析:数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情况。对数据流进行 分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。数据流分析主要适合检验程序中的 数据域特性。
现有主流 Java 静态分析工具
Checkstyle
Checkstyle 是 SourceForge 的开源项目,通过检查对代码编码格式,命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范。
Checkstyle 提供了支持大多数常见 IDE 的插件,文本主要使用 Eclipse 中的 Checkstyle 插件。如下图 1 所示,Checkstyle 对代码进行编码风格检查,并将检查结果显示在 Problems 视图中。图中,代码编辑器中每个放大镜图标表示一个 Checkstyle 找到的代码缺陷。开发人员可通过在 Problems 视图中查看错误或警告详细信息。
此外,Checkstyle 支持用户根据需求自定义代码检查规范,在下图 2 中的配置面板中,用户可以在已有检查规范如命名约定,Javadoc,块,类设计等方面的基础上添加或删除自定义检查规范。
FindBugs
FindBugs 是由马里兰大学提供的一款开源 Java 静态代码分析工具。FindBugs 通过检查类文件或 JAR 文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。FindBugs 既提供可视化 UI 界面,同时也可以作为 Eclipse 插件使用。文本将主要使用将 FindBugs 作为 Eclipse 插件。在安装成功后会在 eclipse 中增加 FindBugs perspective,用户可以对指定 Java 类或 JAR 文件运行 FindBugs,此时 FindBugs 会遍历指定文件,进行静态代码分析,并将代码分析结果显示在 FindBugs perspective 的 bugs explorer 中,如下图 3 所示:
图中 Bug Explorer 中的灰色图标处为 Bug 类型,每种分类下红色图标表示 bug 较为严重,黄色的图标表示 bug 为警告程度。Propreties 列出了 bug 的描述信息及修改方案。
此外,FindBugs 还为用户提供定制 Bug Pattern 的功能。用户可以根据需求自定义 FindBugs 的代码检查条件,如下图 4 所示:
PMD
PMD 是由 DARPA 在 SourceForge 上发布的开源 Java 代码静态分析工具。PMD 通过其内置的编码规则对 Java 代码进行静态检查,主要包括对潜在的 bug,未使用的代码,重复的代码,循环体创建新对象等问题的检验。PMD 提供了和多种 Java IDE 的集成,例如 Eclipse,IDEA,NetBean 等。本文主要使用 PMD 以插件方式与 Eclipse 集成。如下图 5 所示:在 Violations Overview 视图中,按照代码缺陷严重性集中显示了 PMD 静态代码分析的结果。
PMD 同样也支持开发人员对代码检查规范进行自定义配置。开发人员可以在下图 6 中的面板中添加、删除、导入、导出代码检查规范。
Jtest
Jtest 是 Parasoft 公司推出的一款针对 Java 语言的自动化代码优化和测试工具,Jtest 的静态代码分析功能能够按照其内置的超过 800 条的 Java 编码规范自动检查并纠正这些隐蔽且难以修复的编码错误。同时,还支持用户自定义编码规则,帮助用户预防一些特殊用法的错误。Jtest 提供了基于 Eclipse 的插件安装。Jtest 支持开发人员对 Java 代码进行编码规范检查,并在 Jtask 窗口中集中显示检查结果,如下图 7 所示:
同时,Jtest 还提供了对用户定制代码检查配置甚至自定义编码规则的支持,这一功能使得开发人员可以基于不同场景定制所需要的编码规范,如图 8 所示:
Java 静态分析工具对比
本章节将从以下几个方面对上述 Java 静态分析工具进行比较:
应用技术及分析对象
下表 1 列出了不同工具的分析对象及应用技术对比:
Java 静态分析工具
分析对象
应用技术
Checkstyle Java 源文件 缺陷模式匹配
FindBugs 字节码 缺陷模式匹配;数据流分析
PMD Java 源代码 缺陷模式匹配
Jtest Java 源代码 缺陷模式匹配;数据流分析
内置编程规范
Checkstyle:
Javadoc 注释:检查类及方法的 Javadoc 注释
命名约定:检查命名是否符合命名规范
标题:检查文件是否以某些行开头
Import 语句:检查 Import 语句是否符合定义规范
代码块大小,即检查类、方法等代码块的行数
空白:检查空白符,如 tab,回车符等
修饰符:修饰符号的检查,如修饰符的定义顺序
块:检查是否有空块或无效块
代码问题:检查重复代码,条件判断,魔数等问题
类设计:检查类的定义是否符合规范,如构造函数的定义等问题
FindBugs:
Bad practice 坏的实践:常见代码错误,用于静态代码检查时进行缺陷模式匹配
Correctness 可能导致错误的代码,如空指针引用等
国际化相关问题:如错误的字符串转换
可能受到的恶意攻击,如访问权限修饰符的定义等
多线程的正确性:如多线程编程时常见的同步,线程调度问题。
运行时性能问题:如由变量定义,方法调用导致的代码低效问题。
PMD:
可能的 Bugs:检查潜在代码错误,如空 try/catch/finally/switch 语句
未使用代码(Dead code):检查未使用的变量,参数,方法
复杂的表达式:检查不必要的 if 语句,可被 while 替代的 for 循环
重复的代码:检查重复的代码
循环体创建新对象:检查在循环体内实例化新对象
资源关闭:检查 Connect,Result,Statement 等资源使用之后是否被关闭掉
Jtest
可能的错误:如内存破坏、内存泄露、指针错误、库错误、逻辑错误和算法错误等
未使用代码:检查未使用的变量,参数,方法
初始化错误:内存分配错误、变量初始化错误、变量定义冲突
命名约定:检查命名是否符合命名规范
Javadoc 注释:检查类及方法的 Javadoc 注释
线程和同步:检验多线程编程时常见的同步,线程调度问题
国际化问题:
垃圾回收:检查变量及 JDBC 资源是否存在内存泄露隐患
错误检查能力
为比较上述 Java 静态分析工具的代码缺陷检测能力,本文将使用一段示例代码进行试验,示例代码中将涵盖我们开发中的几类常见错误,如引用操作、对象操作、表达式复杂化、数 组使用、未使用变量或代码段、资源回收、方法调用及代码设计几个方面。最后本文将分别记录在默认检查规范设置下,不同工具对该示例代码的分析结果。以下为 示例代码 Test.java。其中,代码的注释部分列举了代码中可能存在的缺陷。
表 2. Java 静态代码分析工具对比
代码缺陷分类
示例
Checkstyle
FindBugs
PMD
Jtest
引用操作 空指针引用 √ √ √ √
对象操作 对象比较(使用 == 而不是 equals) √ √ √
表达式复杂化 多余的 if 语句 √
数组使用 数组下标越界 √
未使用变量或代码段 未使用变量 √ √ √
资源回收 I/O 未关闭 √ √
方法调用 未使用方法返回值 √
代码设计 空的 try/catch/finally 块 √
由表中可以看出几种工具对于代码检查各有侧重。其中,Checkstyle 更偏重于代码编写格式,及是否符合编码规范的检验,对代码 bug 的发现功能较弱;而 FindBugs,PMD,Jtest 着重于发现代码缺陷。在对代码缺陷检查中,这三种工具在针对的代码缺陷类别也各有不同,且类别之间有重叠。
总结
本文分别从功能、特性和内置编程规范等方面详细介绍了包括 Checkstyle,FindBugs,PMD,Jtest 在内的四种主流 Java 静态代码分析工具,并通过一段 Java 代码示例对这四种工具的代码分析能力进行比较。由于这四种工具内置编程规范各有不同,因此它们对不同种类的代码问题的发现能力也有所不同。其中 Checkstyle 更加偏重于代码编写格式检查,而 FindBugs,PMD,Jtest 着重于发现代码缺陷。最后,希望本文能够帮助 Java 软件开发和测试人员进一步了解以上四种主流 Java 静态分析工具,并帮助他们根据需求选择合适的工具。