静态代码分析工具 代码分析
这篇文章给大家聊聊关于静态代码分析工具,以及代码分析对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
做静态代码分析都是用那个软件的
本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 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视图中查看错误或警告详细信息。
图 1.使用 Checkstyle进行编码风格检查
此外,Checkstyle支持用户根据需求自定义代码检查规范,在下图 2中的配置面板中,用户可以在已有检查规范如命名约定,Javadoc,块,类设计等方面的基础上添加或删除自定义检查规范。
图 2.使用 Checkstyle添加自定义代码检查规范
FindBugs
FindBugs是由马里兰大学提供的一款开源 Java静态代码分析工具。FindBugs通过检查类文件或 JAR文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。FindBugs既提供可视化 UI界面,同时也可以作为 Eclipse插件使用。文本将主要使用将 FindBugs作为 Eclipse插件。在安装成功后会在 eclipse中增加 FindBugs perspective,用户可以对指定 Java类或 JAR文件运行 FindBugs,此时 FindBugs会遍历指定文件,进行静态代码分析,并将代码分析结果显示在 FindBugs perspective的 bugs explorer中,如下图 3所示:
图 3.使用 FindBugs进行静态代码分析
图中 Bug Explorer中的灰色图标处为 Bug类型,每种分类下红色图标表示 bug较为严重,黄色的图标表示 bug为警告程度。Propreties列出了 bug的描述信息及修改方案。
此外,FindBugs还为用户提供定制 Bug Pattern的功能。用户可以根据需求自定义 FindBugs的代码检查条件,如下图 4所示:
图 4.使用 FindBugs添加自定义代码检查规范
PMD
PMD是由 DARPA在 SourceForge上发布的开源 Java代码静态分析工具。PMD通过其内置的编码规则对 Java代码进行静态检查,主要包括对潜在的 bug,未使用的代码,重复的代码,循环体创建新对象等问题的检验。PMD提供了和多种 Java IDE的集成,例如 Eclipse,IDEA,NetBean等。本文主要使用 PMD以插件方式与 Eclipse集成。如下图 5所示:在 Violations Overview视图中,按照代码缺陷严重性集中显示了 PMD静态代码分析的结果。
图 5.使用 PMD进行静态代码分析
PMD同样也支持开发人员对代码检查规范进行自定义配置。开发人员可以在下图 6中的面板中添加、删除、导入、导出代码检查规范。
图 6.使用 PMD添加自定义代码检查规范
Jtest
Jtest是 Parasoft公司推出的一款针对 Java语言的自动化代码优化和测试工具,Jtest的静态代码分析功能能够按照其内置的超过 800条的 Java编码规范自动检查并纠正这些隐蔽且难以修复的编码错误。同时,还支持用户自定义编码规则,帮助用户预防一些特殊用法的错误。Jtest提供了基于 Eclipse的插件安装。Jtest支持开发人员对 Java代码进行编码规范检查,并在 Jtask窗口中集中显示检查结果,如下图 7所示:
图 7.使用 Jtest进行静态代码分析
同时,Jtest还提供了对用户定制代码检查配置甚至自定义编码规则的支持,这一功能使得开发人员可以基于不同场景定制所需要的编码规范,如图 8所示:
图 8.使用 Jtest添加自定义代码检查规范
Java静态分析工具对比
本章节将从以下几个方面对上述 Java静态分析工具进行比较:
应用技术及分析对象
下表 1列出了不同工具的分析对象及应用技术对比:
表 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。其中,代码的注释部分列举了代码中可能存在的缺陷。
清单 1. Test.java示例代码
package Test;import java.io.*;public class Test{/*** Write the bytes from input stream to output stream.* The input stream and output stream are not closed.*@param is*@param os*@throws IOException*/public boolean copy(InputStream is, OutputStream os)throws IOException{intcount= 0;//缺少空指针判断byte[] buffer=new byte[1024];while((count= is.read(buffer))>= 0){os.write(buffer,0, count);}//未关闭I/O流returntrue;}/****@param a*@param b*@param ending*@return copy the elements from a to b, and stop when meet element ending*/publicvoid copy(String[] a, String[] b, String ending){intindex;String temp=null;//空指针错误System.out.println(temp.length());//未使用变量intlength=a.length;for(index=0; index&a.length; index++){//多余的if语句if(true){//对象比较应使用equalsif(temp==ending){break;}//缺少数组下标越界检查b[index]=temp;}}}/****@param file*@return file contents as striwww.fltbj.cn#ll if file does not exist*/public void readFile(File file){InputStream is=null;OutputStream os=null;try{is=new BufferedInputStream(newFileInputStream(file));os=new ByteArrayOutputStream();//未使用方法返回值copy(is,os);is.close();os.close();}catch(IOException e){//可能造成I/O流未关闭e.printStackTrace();}finally{//空的try/catch/finally块}}}
通过以上测试代码,我们对已有 Java静态代码分析工具的检验结果做了如下比较,如下表 2所示。
表 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静态分析工具,并帮助他们根据需求选择合适的工具。
九大顶级静态代码分析工具
九大顶级静态代码分析工具包括:
Klocwork:专为大型项目设计,配备超过1000个检查器,支持定制化检查,差异分析和SAST功能,无缝集成到IDE和CI/CD流程中。
Cppcheck:开源且免费的C/C++代码分析工具,以低误报率著称,适用于个人项目和团队协作。
CppDepend:商业工具,专注于代码库的深度洞察,支持自定义规则,帮助开发者可视化代码结构的复杂性。
Parasoft C/C++test:专为企业和嵌入式应用打造的静态代码分析工具,功能强大,与IAR Systems构建工具无缝对接,提供一站式解决方案。
PVS Studio:商业级的深度检测工具,擅长挖掘隐藏的bug,与主流CI工具集成,提升开发效率。
其他顶级静态代码分析工具还包括:
SonarQube:广泛使用的开源静态代码分析工具,支持多种编程语言,提供丰富的代码质量报告和持续改进建议。
Coverity:强大的静态代码分析工具,专注于发现安全漏洞和质量缺陷,适用于大型软件项目。
Fortify Static Code Analyzer:商业级的静态代码分析工具,提供全面的安全漏洞检测和质量保证功能。
Checkmarx:专注于安全漏洞检测的静态代码分析工具,支持多种编程语言和框架,帮助开发者及时发现并修复潜在的安全风险。
这些工具各有特色,开发者可以根据项目需求选择合适的工具进行代码分析,以提升代码质量和安全性。
这5个开源和免费静态代码分析工具,你一个都没有用过吗
这5个开源和免费静态代码分析工具,你可能需要了解一下
在软件开发过程中,静态代码分析工具是提升代码质量和安全性的重要工具。它们能够自动检查代码中的潜在问题,帮助开发人员及时发现并修复漏洞。以下是五个开源且免费的静态代码分析工具,它们各自具有独特的功能和优势:
1. VisualCodeGrepper
VisualCodeGrepper是一款针对多种编程语言的超快速且强大的源代码分析工具。它支持C、C++、C#、VB、PHP、Java、PL/SQL和COBOL等语言,能够大大加快代码检查过程。该工具通过识别不安全的代码来提供详细的报告,包括代码、空格、注释和错误代码的相对比例,以及潜在的不安全标志和代码位。此外,VisualCodeGrepper还具备智能搜索功能,能够查找缓冲区溢出以及有符号或无符号比较等复杂问题。
2. RIPS
RIPS(增强编程安全性)是一款针对PHP、Java和Node.Js的静态代码分析工具。它能够自动检测PHP和Java应用程序中的安全漏洞,并支持所有主要的PHP和Java框架。RIPS可以部署为自托管软件或用作云服务,具有SDLC集成和相关行业标准。该工具因其极高的准确性和速度而受到欢迎,能够在不到20分钟的时间内扫描22亿行的代码。此外,RIPS还能够检测到一些其他扫描仪可能遗漏的安全漏洞。
3. Brakeman
Brakeman是一款专为Ruby on Rails应用程序设计的免费开源漏洞扫描程序。它是一个静态代码分析器,能够在开发过程中的任何阶段扫描Rails应用程序代码以发现安全问题。与许多其他Web安全扫描程序不同,Brakeman可以查看应用程序的源代码,因此无需设置整个应用程序堆栈即可使用。扫描完成后,Brakeman会生成详细的报告,针对所有安全问题提供建议。
4. Flawfinder
Flawfinder是一款免费的简单程序,用于扫描C或C++源代码以快速识别可能的安全漏洞。它生成按风险级别排序的报告,对于在程序广泛发布之前快速发现并消除潜在的安全问题非常有用。Flawfinder易于安装和使用,并附带一个简单的用户指南。此外,它还与Common Weakness Enumeration(CWE)兼容,并获得了CII最佳实践通过徽章。
5. Bandit
Bandit是一款专门用于查找Python代码中常见安全问题的免费工具。它使用适当的插件处理每个文件,并在Python代码中生成有关可能的安全性错误的详细报告。Bandit支持命令行界面,并允许用户指定基准报告的路径以忽略已知漏洞。此外,它还支持CSV、HTML或JSON文件格式,并允许用户编写和注册检查和格式化程序的扩展名。
这些开源和免费的静态代码分析工具各有千秋,能够帮助开发人员提升代码质量和安全性。如果你还没有使用过这些工具,不妨尝试一下,相信它们会为你的开发工作带来不小的帮助。
文章分享结束,静态代码分析工具和代码分析的答案你都知道了吗?欢迎再次光临本站哦!