摘要:靜態程式碼檢查又稱為靜態程式分析,是指在不執行計算機程式的條件下,進行程式分析的方法。

本文分享自華為雲社群《公司新來了一個質量工程師,說團隊要保證 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 質量門禁

關於工具,不同的靜態程式碼檢查工具使用起來是不相同,可以通過工具的官方網站或者其他網頁分享找到對應的使用方法。重點是要理解為什麼要做靜態程式碼檢查這件事,這樣才能真正用心的把這件事做好,而不是走過場。在任何時候,讓團隊成員知道為什麼做永遠都比告訴怎麼做要重要。為了做好測試左移,實現質量內建,將錯誤扼殺在萌芽種,降低缺陷修復成本,儘早交付給客戶可工作的軟體,創造有價值的產品,讓我們一起做好靜態程式碼檢查吧。

點選關注,第一時間瞭解華為雲新鮮技術~