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

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

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

图1 check清零

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

什么是静态代码检查

图 2 静态代码扫描

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

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

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

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

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

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

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

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

图 4 缺陷修复成本

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

如何进行静态代码检查

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

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

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

1.新建代码检查任务

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

图 5-1 Code Check新建任务

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

图 5-2 Code Check 选择源码源

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

图 5-3 Code Check 规则集

2.执行代码检查任务

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

图 6-1 Code Check 执行任务

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

图 6- 2 Code Check 缺陷展示

3.查看代码检查报告

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

图 7 Code Check检查报告

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

写在最后

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

图 8 质量门禁

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

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

公司新来了一个质量工程师,说团队要保证 0 error,0 warning的更多相关文章

  1. (转)我在北京工作这几年 – 一个软件工程师的反省

    我于2007年来到北京,在北京工作这些年,先后在NEC.风行.百度几家公司担任软件工程师的职务.NEC是一家具有百年历史的传统日企,在知春路的分公司叫日电电子,我们部门主要从事机顶盒.数字电视上嵌入式 ...

  2. 5G为何采纳华为力挺的Polar码?一个通信工程师的大实话

    Polar码被采纳为5G eMBB场景的控制信道编码,这两天连续被这条消息刷屏,连吃瓜群众都直呼好爽. 然而,随着媒体报道的持续发酵,真相在口口相传中变了形,不乏夸大不实之嫌,小编终于坐不住了,也想吐 ...

  3. [转][业界动态] 5G为何采纳华为力挺的Polar码?一个通信工程师的大实话

    本文转自:http://xinsheng.huawei.com/cn/index.php?app=forum&mod=Detail&act=index&id=3264791 P ...

  4. 一个Java工程师的入门级Linux命令集

    0.前言    网上介绍linux的命令的文章一大堆,但是大部分都是流于命令介绍,把命令的所有参数都介绍一遍,但是其实在真正的工作中,很多参数都不会用到.本文总结了我自己常用的一些命令,这些命令都比较 ...

  5. 为什么每一个爬虫工程师都应该学习 Kafka

    这篇文章不会涉及到Kafka 的具体操作,而是告诉你 Kafka 是什么,以及它能在爬虫开发中扮演什么重要角色. 一个简单的需求 假设我们需要写一个微博爬虫,老板给的需求如下: 开发爬虫对你来说非常简 ...

  6. Cloudera公司主要提供Apache Hadoop开发工程师认证

    Cloudera Cloudera公司主要提供Apache Hadoop开发工程师认证(Cloudera CertifiedDeveloper for Apache Hadoop ,CCDH)和Apa ...

  7. Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结

    Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结 1.1. Java的编年史2 ...

  8. [团队项目]SCRUM项目6.0 7.0 (新)

    6.0----------------------------------------------------- sprint演示 1.坚持所有的sprint都结束于演示. 团队的成果得到认可,会感觉 ...

  9. webpack 4.0.0-beta.0 新特性介绍

    webpack 可以看做是模块打包机.它做的事情是:分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包为合适的格式 ...

随机推荐

  1. 『心善渊』Selenium3.0基础 — 26、unittest测试框架的断言

    目录 1.断言介绍 2.常用的断言方法 3.断言示例 1.断言介绍 在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的,这时会用到断言方法. 本着没有消 ...

  2. ESP32高分辨率计时器笔记

    尽管FreeRTOS提供了软件计时器,但这些计时器有一些限制: 最大分辨率等于RTOS滴答周期 计时器回调从低优先级任务分派 硬件计时器不受这两个限制,但是通常它们使用起来不太方便.例如,应用组件可能 ...

  3. CF1225E题解 Rock Is Push

    在打CF的时候没想到www这个dp真的蛮巧妙的 这是一道dp题(废话 假设我们走到了\((i,j)\)位置,因为我们只能下移/右移,那么我们所有上方与左方的石块(即\(\{ (i,j)|i<n ...

  4. 从源码角度谈谈MySQL "Too many open files"错误的根本原因

    "Too many open files"是一个比较常见的错误,不仅仅是在 MySQL 中.只要是在 Linux 中启动的进程,都有可能遇到这个错误. 究其原因,是进程打开的文件描 ...

  5. C语言:强制类型转换

    #include <stdio.h> //强制类型转换 //写法:(类型标识符)变量:(类型标识符)常量:(类型标识符)(表达式):三种格式 main() { float a=7.5f; ...

  6. ZooKeeper 分布式锁 Curator 源码 03:可重入锁并发加锁

    前言 在了解了加锁和锁重入之后,最需要了解的还是在分布式场景下或者多线程并发加锁是如何处理的? 并发加锁 先来看结果,在多线程对 /locks/lock_01 加锁时,是在后面又创建了新的临时节点. ...

  7. Java安全之XStream 漏洞分析

    Java安全之XStream 漏洞分析 0x00 前言 好久没写漏洞分析文章了,最近感觉在审代码的时候,XStream 组件出现的频率比较高,借此来学习一波XStream的漏洞分析. 0x01 XSt ...

  8. 10分钟系列:NetCore3.1+EFCore三步快速完成数据库交互

    前言 做程序开发,不管是什么语言什么数据库,其中的ORM(对象关系映射)是必不可少的,但是不管选择哪一种ORM,都需要了解其中的运行机制,配置帮助类等等. 所以很多ORM都开始进行升级封装,我们只需要 ...

  9. 龙芯 loongnix20 rc2 初体验

    2021-07-24 v0.0.1 版权声明:原创文章,未经博主允许不得转载 3A5000 昨天发布啦,历史上的昨天是中共一大的第一天. 3A5000 的团购还没开始(大概还是3999左右整机的样子) ...

  10. JDK的环境变量配置(详细步骤)

    JDK环境变量配置的步骤(Windows10) 一.下载并安装JDK 选择一个JDK版本下载并安装到电脑上. 二.环境变量的配置 1.安装完成JDK后的配置环境变量: 首先鼠标右击"计算机& ...