摘要:静态代码检查又称为静态程序分析,是指在不运行计算机程序的条件下,进行程序分析的方法。

本文分享自华为云社区《公司新来了一个质量工程师,说团队要保证 0 error,0 warning》,作者:敏捷的小智 。

公司新来了一个质量工程师,说要进行过程改善、提高质量、降本增效……因此一系列的分析、报告和新增的质量活动陆续上线,其中被大家吐槽最多的是:check清零。什么意思呢?就是质量工程师会监督静态代码检查的修复结果,团队要保证 0 error,0 warning
image.png

图1 check清零

小伙伴可能会奇怪:修复静态代码检查结果这事,对于每个程序员来说不是天经地义吗?为啥要吐槽呢?我们先来了解下什么是静态代码检查。

什么是静态代码检查

image.png

图 2 静态代码扫描

根据维基百科,静态代码检查又称为静态程序分析,是指在不运行计算机程序的条件下,进行程序分析的方法。静态代码检查工具会从词法、语法、语义等多维度去对工程代码扫描分析,发现可能存在的问题,比如变量未定义、类型不匹配、变量作用域问题、数组下标越界、内存泄露等问题。工具会按照自己的规则进行问题的严重等级划分,给出不同的标识和提示。

通常情况下,静态代码检查之后大家都会去将错误清零,但是有些警告不影响程序功能就忽略不去修改了。同时修改这类问题需要投入的时间比较多,增加了团队的工作量。而且对于新人来说,如果不熟悉代码框架的情况,修改静态检查问题的时候还有可能导致出现新的bug出现。有时工具还存在误报的情况等等,所以就出现了文章开头中团队的吐槽点:check清零。既然如此,为什么要进行静态代码检查呢?

为什么要进行静态代码检查

回答这个问题,我们要追溯到团队存在的意义是什么,是为了尽早交付给客户可工作的软件,为了创造价值。可工作的软件必然是不存在缺陷,尽早交付必然要尽早发现问题,而静态代码检查就是能够尽早发现问题的一个必要环节。

同时,从缺陷修复成本上看,戴明曾提出“缺陷发现得越早,修复的成本越低”。有数据指 85% 的缺陷都是在代码编码阶段引入的,然而大部分的缺陷并不是在编码的时候发现的,而是在之后的测试阶段发现的,甚至是已经上线后。而且随着越往后发现缺陷,修复的成本也越高。

在 STICKYMINDS 网站上的一篇名为 《 The Shift-Left Approach to Software Testing 》 的文章中提到,假如在编码阶段发现的缺陷只需要 1 分钟就能解决,那么单元测试阶段需要 4 分钟,功能测试阶段需要 10 分钟,系统测试阶段需要 40 分钟,而到了发布之后可能就需要 640 分钟来修复 。
image.png

图 3 来源《 Applied Software Measurement:Global Analysis of Productivity and Quality》

静态代码检查也叫静态测试,是质量内建举措中的测试左移实践之一,在静态代码检查阶段发现代码的问题修复成本是很低的。
image.png

图 4 缺陷修复成本

由此可见,静态代码检查在项目中是必不可少的一个环节。

如何进行静态代码检查

不同的语言都有自己对应的一款或者几款代码检查工具,许多静态代码检查工具也可以支持两种或者多种语言。比如 Coverity 可以支持 C/C++,C#,JAVA , Checkstyle、FindBugs和PMD支持Java,rats支持C/C++,Python,Perl,PHP,工具很多就不一一列举。

随着云原生和DevOps的普及,云端开发和流水线的推广,云上的静态代码检查功能也应运而生,这里以 华为云DevCloud 的 Code Check 为例,一起来看一下如何在云端轻松实现对多编程语言的检查。

使用起来很简单,三步走就可以完成:新建任务 -> 执行任务 -> 查看报告。

1.新建代码检查任务

在 华为云DevCloud 首页工具栏选择“服务 > 代码检查”进入,或者点击 Code Check 进入。或者点击 Code Check 进入。单击“代码检查”首页的“新建任务”创建代码检查任务。
image.png

图 5-1 Code Check新建任务

创建任务时通过关联项目下代码仓库拉取代码。源代码有4个来源可选,不同的选择要填写对应的参数值,同时选择代码工程的语言类型。
image.png

图 5-2 Code Check 选择源码源

创建任务后,可以在设置中进行规则集选择。Code Check会识别到代码中包含的语言,然后在对应的语言规则集中选择中选择对应的规则即可。CodeCheck 可以 支持 Java、JavaScript、CSS、HTML、PHP、C#、Android等常见 10 种开发语言,还可以多种语混合检查;可以提供近2000条华为典型检查规则,支持web检查、安全检查、架构检查、编码问题检查等场景。
image.png

图 5-3 Code Check 规则集

2.执行代码检查任务

代码检查任务新建成功后,单击任务的开始检查按钮进行执行。
image.png

图 6-1 Code Check 执行任务

检查后会根据问题级别进行分类显示,并提供详细的缺陷影响说明、正确示例、错误示例、修改建议。
image.png

图 6- 2 Code Check 缺陷展示

3.查看代码检查报告

检查后可以提供多维度报表,单击检查任务名称链接,进入代码检查任务详情页面,可以查看“概览”、“ 代码 问题”、 “代码质量”、 “圈复杂度”、“代码重复率” 等信息 。
image.png

图 7 Code Check检查报告

更多的 Code Check 内容可以访问 Code Check 介绍

写在最后

讲了这么多,质量工程师要求的“check清零”对不对,到底要不要做?这其实就是代码检查中质量门禁的作用。静态代码扫描出来的问题项按照致命、严重、一般和提示进行分类。从交付的角度,首先是保证可工作的代码,因此致命和严重的问题是不应该存在的,所以门禁开关打开,阈值为0。剩下的一般问题和提示问题如果不影响代码功能,可以考虑在当前迭代不予处理,但是要分析是否应对,以及确定完成的日期,可以以技术债的形式存在待办列表项中,在某一个缓冲迭代中进行统一处理。简单来说,就是团队要根据业务交付的实际情况,共同决定质量门禁如何设置,而不是简单的一刀切。
image.png

图 8 质量门禁

关于工具,不同的静态代码检查工具使用起来是不相同,可以通过工具的官方网站或者其他网页分享找到对应的使用方法。重点是要理解为什么要做静态代码检查这件事,这样才能真正用心的把这件事做好,而不是走过场。在任何时候,让团队成员知道为什么做永远都比告诉怎么做要重要。为了做好测试左移,实现质量内建,将错误扼杀在萌芽种,降低缺陷修复成本,尽早交付给客户可工作的软件,创造有价值的产品,让我们一起做好静态代码检查吧。

点击关注,第一时间了解华为云新鲜技术~


华为云开发者联盟
1.4k 声望1.8k 粉丝

生于云,长于云,让开发者成为决定性力量