从Java程序猿到软件架构师:代码质量静态检查工具
Posted IT有得聊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Java程序猿到软件架构师:代码质量静态检查工具相关的知识,希望对你有一定的参考价值。
编辑导语:要想快速有效地优化自己的Java代码,静态检查工具必不可少。代码质量静态检查工具可以自动快速发现劣质代码,潜在Bug,给出代码优化建议。因此代码静态检查工具在实际项目研发中有举足轻重的作用,利用好各种优秀检查工具是做好软件品质管理的重要环节。
秩序就是正确的规律和事物永久的合理性。—— 菲尔丁
代码分析技术分为:
Ø 第一、静态分析:对程序代码的检查;
Ø 第二、动态分析:程序运行时检查;
静态分析是在不执行程序的情况下对其进行分析的技术,简称为静态分析。静态分析可以被视为自动化代码审查过程,是检查瑕疵的最古老和最安全的方法。动态分析着重于内存、性能和资源的检查。
静态分析技术原理和编译器的技术原理有很多相似之处,主要也是使用词法分析,语法分析,语意分析等分析技术对代码进行解析。但和编译器不一样的最主要区别是各种静态分析工具可以自定义各种各样的复杂规则。
■静态分析特点
Ø 不实际执行程序;
Ø 执行速度快、效率高;
Ø 全代码扫描;
■常用静态分析技术
类别 |
概述 |
应用场景 |
缺陷模式匹配分析 |
缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。 |
这种方式的优点是简单方便,但是要求内置足够多的缺陷模式,且容易产生误报。 |
类型推断分析 |
类型推断分析是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。这种技术首先将预定义一套类型机制,包括类型等价、类型包含等推理规则,而后基于这一规则进行推理计算。 |
类型推断分析可以检查代码中的类型错误,其特点是简单,高效,适合代码缺陷的快速检测。 |
模型检验 |
模型检验建立于有限状态自动机的概念基础之上,这一理论将被分析代码抽象为一个自动机系统,并且假设该系统是有限状态的、或者是可以通过抽象归结为有限状态。模型检验过程中,首先将被分析代码中的每条语句产生的影响抽象为一个有限状态自动机的一个状态,而后通过分析有限状态机从而达到代码分析的目的。 |
模型检验主要适合检验程序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。 |
数据流分析 |
数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情况。对数据流进行分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。 |
数据流分析主要适合检验程序中的数据域特性。 |
■静态分析技术可以给我们带来以下好处:
Ø 一、帮助程序员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。 30% 至70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。下图是Bug在各个阶段发现的成本示意图,由图可知单体测试是编码时的2倍,而集成测试是编码阶段的5倍!静态代码检查所进入的阶段是编码阶段,因此可以显著节省研发经费。
Ø 二、提高软件的可靠性。
Ø 三、节省软件开发和测试成本。
■虽然静态分析技术可以带来以上好处,然而也有以下不足:
Ø 一、会出现误报。代码静态分析是通过对程序扫描找到匹配某种规则模式的代码,从而发现代码中存在的问题。这种分析出的结果不完全正确,因此需要对分析出的结果逐一确认。
Ø 二、不能够完全检查出项目质量管理中定义所有质量标准规范,需要结合实际,进行人工检查。
人工代码检查,是对自动化工具检查的补充。实际研发过程中一般要开品质管理会议,统一产品质量。每个开发人员应该选取一个具有代表其水平的代码文件,交给架构师或品质管理员进行检查(review),以确认其质量水平。在人工检查之前,一般都要求程序员先用工具进行自我检查,再对工具不能检测出的质量标准项等(检查清单)进行检查。
常用重要静态分析工具一般有以下四种:
工具名称 |
所属组织 |
简介 |
特色 |
规则数 |
下载网站 |
Checkstyle |
SourceForge |
Checkstyle通过检查对代码编码格式、命名规约、Javadoc、类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范。支持用户根据需求自定义代码检查规范。 |
偏重于代码编写格式 |
134 |
|
FindBugs |
马里兰大学 |
FindBugs通过检查类文件或JAR文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。FindBugs还为用户提供定制 Bug Pattern 的功能。用户可以根据需求自定义 FindBugs 的代码检查条件。 |
偏重于发现代码缺陷 |
408 |
|
PMD |
DARPA |
PMD通过其内置的编码规则对Java代码进行静态检查,主要包括对潜在的Bug,未使用的代码,重复的代码,循环体创建新对象等问题进行检测。完成静态代码分析也支持开发人员对代码检查规范进行自定义配置。也具有jsp,xml等代码检查功能。 |
偏重于发现代码缺陷 |
368 |
|
Jtest |
倍睿(Parasoft) |
一款针对Java语言的自动化代码优化和检测工具,Jtest的静态代码分析功能能够按照其内置的超过1000多条的Java编码规范自动检查并纠正这些隐蔽且难以修复的编码错误。同时,还支持用户自定义编码规则,帮助用户预防一些特殊用法的错误。 |
偏重于发现代码缺陷 |
1000 |
面对如此多的静态代码检查工具,我们应该如何使用呢?实际商业开发中,我们不可能把所有的代码检查工具都用一次进行代码检查,但是我们可以从中选择一款或者几款配合起来使用。常用的静态代码分析工具搭配是:一款格式检查工具+一款Bug检测工具,最佳实战组合是Checkstyle+FindBug。
(未完待续)
本文摘自《Java代码与架构之完美优化——实战经典》
作者简介:
颜廷吉 北京大学软件工程硕士毕业
上海颐凡软件科技有限公司 创始人兼首席架构师
曾在日本最大的软件企业NTT DATA工作多年
曾参与开发:
日本厚生劳动省HelloWork大型国家项目(富士通)
日本国家饮料自动贩机检量大型商业项目(NTTDATA )
日本国家香烟自动贩检量二期大型商业项目( 日立)
以上是关于从Java程序猿到软件架构师:代码质量静态检查工具的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-95]:《软件架构设计:程序员向架构师转型必备》-5-需求分析之需求列表(功能需求质量需求约束条件)