从Java程序猿到软件架构师(2):代码质量静态检查工具

编辑导语:要想快速有效地优化自己的Java代码,静态检查工具必不可少。代码质量静态检查工具可以自动快速发现劣质代码,潜在Bug,给出代码优化建议。因此代码静态检查工具在实际项目研发中有举足轻重的作用,利用好各种优秀检查工具是做好软件品质管理的重要环节。

秩序就是正确的规律和事物永久的合理性。—— 菲尔丁

代码分析技术分为:

Ø第一、静态分析:对程序代码的检查;

Ø第二、动态分析:程序运行时检查;

静态分析是在不执行程序的情况下对其进行分析的技术,简称为静态分析。静态分析可以被视为自动化代码审查过程,是检查瑕疵的最古老和最安全的方法。动态分析着重于内存、性能和资源的检查。

静态分析技术原理

静态分析技术原理和编译器的技术原理有很多相似之处,主要也是使用词法分析,语法分析,语意分析等分析技术对代码进行解析。但和编译器不一样的最主要区别是各种静态分析工具可以自定义各种各样的复杂规则。

■静态分析特点

Ø不实际执行程序;

Ø执行速度快、效率高;

Ø全代码扫描;

■常用静态分析技术

类别

概述

应用场景

缺陷模式匹配分析

缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。

这种方式的优点是简单方便,但是要求内置足够多的缺陷模式,且容易产生误报。

类型推断分析

类型推断分析是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。这种技术首先将预定义一套类型机制,包括类型等价、类型包含等推理规则,而后基于这一规则进行推理计算。

类型推断分析可以检查代码中的类型错误,其特点是简单,高效,适合代码缺陷的快速检测。

模型检验

模型检验建立于有限状态自动机的概念基础之上,这一理论将被分析代码抽象为一个自动机系统,并且假设该系统是有限状态的、或者是可以通过抽象归结为有限状态。模型检验过程中,首先将被分析代码中的每条语句产生的影响抽象为一个有限状态自动机的一个状态,而后通过分析有限状态机从而达到代码分析的目的。

模型检验主要适合检验程序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。

数据流分析

数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情况。对数据流进行分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。

数据流分析主要适合检验程序中的数据域特性。

静态分析技术给我们带来的好处

■静态分析技术可以给我们带来以下好处:

Ø一、帮助程序员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。 30% 至70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。下图是Bug在各个阶段发现的成本示意图,由图可知单体测试是编码时的2倍,而集成测试是编码阶段的5倍!静态代码检查所进入的阶段是编码阶段,因此可以显著节省研发经费。

Ø二、提高软件的可靠性。

Ø三、节省软件开发和测试成本。

■虽然静态分析技术可以带来以上好处,然而也有以下不足:

Ø一、会出现误报。代码静态分析是通过对程序扫描找到匹配某种规则模式的代码,从而发现代码中存在的问题。这种分析出的结果不完全正确,因此需要对分析出的结果逐一确认。

Ø二、不能够完全检查出项目质量管理中定义所有质量标准规范,需要结合实际,进行人工检查。

人工代码检查,是对自动化工具检查的补充。实际研发过程中一般要开品质管理会议,统一产品质量。每个开发人员应该选取一个具有代表其水平的代码文件,交给架构师或品质管理员进行检查(review),以确认其质量水平。在人工检查之前,一般都要求程序员先用工具进行自我检查,再对工具不能检测出的质量标准项等(检查清单)进行检查。

常用重要静态分析工具

常用重要静态分析工具一般有以下四种:

工具名称

所属组织

简介

特色

规则数

下载网站

Checkstyle

SourceForge

Checkstyle通过检查对代码编码格式、命名规约、Javadoc、类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范。支持用户根据需求自定义代码检查规范。

偏重于代码编写格式

134

http://checkstyle.sourceforge.net/

FindBugs

马里兰大学

FindBugs通过检查类文件或JAR文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。FindBugs还为用户提供定制 Bug Pattern 的功能。用户可以根据需求自定义 FindBugs 的代码检查条件。

偏重于发现代码缺陷

408

http://findBugs.sourceforge.net/

PMD

DARPA

PMD通过其内置的编码规则对Java代码进行静态检查,主要包括对潜在的Bug,未使用的代码,重复的代码,循环体创建新对象等问题进行检测。完成静态代码分析也支持开发人员对代码检查规范进行自定义配置。也具有jsp,xml等代码检查功能。

偏重于发现代码缺陷

368

http://pmd.sourceforge.net/

Jtest

倍睿(Parasoft)

一款针对Java语言的自动化代码优化和检测工具,Jtest的静态代码分析功能能够按照其内置的超过1000多条的Java编码规范自动检查并纠正这些隐蔽且难以修复的编码错误。同时,还支持用户自定义编码规则,帮助用户预防一些特殊用法的错误。

偏重于发现代码缺陷

1000

http://www.parasoft.com/jtest

面对如此多的静态代码检查工具,我们应该如何使用呢?实际商业开发中,我们不可能把所有的代码检查工具都用一次进行代码检查,但是我们可以从中选择一款或者几款配合起来使用。常用的静态代码分析工具搭配是:一款格式检查工具+一款Bug检测工具,最佳实战组合是Checkstyle+FindBug。

如果你也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,7个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来,群号为:71859422

注:加群要求

1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

6.小号或者小白之类加群一律不给过,谢谢。

目标已经有了,下面就看行动了!记住:学习永远是自己的事情,你不学时间也不会多,你学了有时候却能够使用自己学到的知识换得更多自由自在的美好时光!时间是生命的基本组成部分,也是万物存在的根本尺度,我们的时间在那里我们的生活就在那里!我们价值也将在那里提升或消弭!Java程序员,加油吧!

举报
评论 0