【转】静态代码分析工具初识

一、什么是静态代码分析

静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。

在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。

但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。

参考Java静态检测工具的简单介绍

二、优势

1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。

2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。

3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。

三、常用工具

对前面三个工具的比较

3.1 Checkstyle

Checkstyle是一个开发工具,可用来帮助开发者编写符合编码标准的代码。它自动执行检查Java代码的过程,使人们从这种无聊但是重要的任务中解放出来。对于那些想要执行代码标准的项目,这是非常理想的。

Checkstyle是高配置的,几乎可以支持任何代码标准。也可以用来帮助发现类的设计问题,重复代码,问题代码等等。支持与Ant 整合

特点:可作为Eclipse 的plug-in,可嵌入Ant,由基于XML配置文件来驱动

3.2 FindBugs

FindBugs是一个能静态分析源代码中可能会出现Bug的Eclipse插件工具。它也可以分析被编译过的程序。这个工具已经被下载了超过70万次。

自带检测器的介绍:

FindBugs能发现的所有Bug类型: http://findbugs.sourceforge.net/bugDescriptions.html提供了完整的类型清单。

FindBugs自带60余种Bad practice,80余种Correntness,1种Internationalization,12种Malicious code vulnerability,27种Multithreaded correntness,23种Performance,43种Dodgy。

特点:不注重style及format,直接操作类文件(class文件),可作为Eclipse 的plug-in,可嵌入Ant作为task之一,

3.3 PMD

PMD是一款采用BSD协议发布的Java程序代码检查工具。该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等。该软件功能强大(可以自己定义规则),扫描效率高,是Java程序员debug的好帮手。

PMD支持的编辑器包括:
JDeveloper、 Eclipse、JEdit、JBuilder、BlueJ、CodeGuide、NetBeans/Sun Java Studio Enterprise/Creator、IntelliJ IDEA、TextPad、Maven、Ant,、Gel、JCreator和Emacs。

特点:可作为Eclipse 的plug-in,静态分析

findbugs:
非常好用的一款代码检测工具,检测的深度比较深,对代码中渗透的性能,内存的使用释放有很好的检测。能检测出可能导致错误的代码,如空指针引用等等。
首选必备。

checkstyle:
顾名思义,他就是一款检测代码风格样式的工具,对ccs都会有检测,可以用以辅助提高开发过程中的代码风格。缺点很多检测过于细致和格式化冲突,
比如注释都会高亮显示,很扰乱视线,所以使用时候组号可以做自定义的风格规范。对代码的bug发现力度较弱。

PMD:
20M大小,说明他的检测非常的广,在我看来的确也是,system.out.println 也会做为error提示。一些命名的检测等。的确并不是代码的bug,
而是项目中代码的规范检测。深度没有findbugs深,在使用findbugs的情况下,可以配合pmd来检测一些不规范的代码。

3.4 Sonar

Sonar提供了设计与架构的度量。Sonar 2.0引入了针对Java应用的设计分析、架构与面向对象的度量,Sonar 2.1可以检测到未使用的方法以及对不建议使用方法的调用。是一个集成了CheckStyle,PMD,Findbugs的代码校验规则 ,重复代码发现,代码测试覆盖率, 代码注释率,及所有的检测率变化追踪的完美代码质量检查工具。它包含了代码质量检测的七个方面

特点:

  1. 代码覆盖率:通过单元测试,将会显示哪行代码被选中。
  2. 改善编码规则。
  3. 搜寻编码规则:按照名字,插件,激活级别和类别进行查询。
  4. 项目搜寻:按照项目的名字进行查询。
  5. 对比数据:比较同一张表中的任何测量的趋势。
  6. 单元测试

4.2 Sonar2.1:

Sonar还基于Squid引入了一个全新的规则引擎、Sonar解析器既可以处理源代码,也可以处理字节码,解析器带有内建的规则,可以检测未使用的私有与保护方法以及客户端对不建议使用的方法的调用。Squid通过分析应用源代码、Java API和外部程序库的字节码来决定哪些方法、类和属性是不建议使用的。

Sonar 2.1的新特性:

1)一个全新的“Libraries”页面,显示了项目中所有的程序库和依赖,该特性要求使用Maven来构建项目。一旦在Sonar站点的主页上选择了一个项目,该服务就会以可视化的树形结构展示出项目依赖。此外,还有一个可选的动态过滤器,可以根据名称过滤程序库以便在应用的依赖间导航。

2)用于搜索程序库使用情况的“Dependencies”页面。比如说,可以搜索到使用了第三方框架如Commons Logging 1.1的所有项目。

3)可以使用各种插件扩展Sonar的功能。现在有一个全新的“System Info”页面显示了系统属性、已装插件和Java虚拟机内存统计信息。该页面还给出了关于Sonar配置和数据库统计的详细信息。

4)一个用于管理已装插件和系统信息的管理控制台。最新版的Sonar为这些插件引入了一个测试框架和一个客户化的Maven生命周期管理工具。它还带有一个用于集成项目事件的Web Service并在项目的size widget中增加了一个新的度量模块。

3.5 其他工具:

  • Hammurapi
  • IBM Checking Tool for Bugs Errors and Mistakes(简称BEAM)
  • JDepend
  • Jtest
  • Lint4j
  • LDRA Testbed
  • Yasca

 

posted @ 2020-04-29 10:59  雨 燕  阅读(421)  评论(0编辑  收藏  举报