OpenCover團隊的代碼靜態分析方案:Coverity VS SonarQube

在軟體開發生命周期中,儘早找到和修復Bug已經成為一個剛性需求,因此也帶來代碼靜態分析技術(SAST)的引入和不斷發展。因其可以在早期編碼階段發現崩潰、多線程和注入等質量與安全類型問題,同時又能夠與Devops,CI/CD,Agile各項技術緊密結合,所以各大中小型研發團隊都已經用上了各式各樣的靜態分析工具。換句話說,用好SAST工具已經成為每一個研發團隊都需要掌握的技能,這篇文章用Shaun Wilde(以下簡稱SW)介紹的OpenCover團隊代碼靜態分析經驗,拋磚引玉來聊一聊測試開發技術的SAST技術。

關於OpenCover項目

OpenCover是知名的C#代碼覆蓋率統計工具,支持.NET 2以上版本的32位和64位平台(包括Silverlight),支持分支和判定覆蓋率。該項目是一個開源項目,由眾多開源成員共同維護。

OpenCover的代碼質量管控背景-SW

我加入OpenCover等開源項目工作組的其中一個原因是,我可以嘗試一下新的理念和技術,比如TDD(測試驅動開發)技術或新的Mock框架,有時甚至是工具; 有些是非常成功的嘗試,另外一些是非常成功的「失敗」嘗試; 我使用SpecFlow進行單元測試的實驗很有趣,但是我再也不會這麼做了。但是對SpecFlow所能做到事情上的認知卻有了很大的提高。

工具能夠幫我們做出更好的軟體,使用的工具越好,研發團隊就會越知道如何使用這些工具 – 來成為一個更好的程序員,因為你有最好的工具(並且花了很多錢來用上這些工具)。當然即使你不學習如何正確使用它們(或者基本了解),你也可以用其他方法節省成本。但是事實上,在開源世界中,缺乏資金是我一個普遍問題,雖然我們一直在耗費寶貴的時間,用我們的工作電腦、那些昂貴的IDE和額外的工具來執行開發。但我們確實想告訴夥伴們,我們已經親自花了大力氣來發布更好的代碼,無論是從技術上還是從硬體基礎設施上。值得慶幸的是,.NET開發人員現在可以用Visual Studio 社區版進行開發,這樣能夠節省100美元的代價,但是代碼質量和安全工具確實一直處於比較昂貴的範圍,對於程序員來說遙不可及。但是在大多數情況下,有一些很好的代碼質量工具可供開源開發者免費使用,也相對容易設置。

OpenCover 與Coverity-SW

Coverity是第一個被集成到OpenCover Pipeline的質量度量工具;它能夠處理 C#,C++,Java,JavaScript,Android,Objective-C和其他許多類型的語言。OpenCover團隊的成員在很早之前就開始建議使用這個工具- 我們通過Coverity定位到了一些代碼中非常嚴重的高等級問題,後來花了一些時間才集成到pipeline里 - 大約一天的本地配置、建立腳本等工作,讓它能夠運行在AppVeyor自動化集成環境中。現在我回頭了看了看這些歷史,有些後悔等了這麼久才完全集成 - AppVeyor已經預裝了Coverity他們的鏡像中,也把Coverity配置到了環境變數里,所以這其實是一個很簡單的任務。成功地完成了第一次掃描分析後,我們得到了一個清晰而且功能強大的儀錶板(Dashboard),能夠很方便的管理缺陷並設置例外狀況,如按時間維度的修復趨勢與缺陷密度(見如下兩圖)。

你也可以在本地運行Coverity,將中間結果上傳到Coverity的網站(僅支持開源項目)。以下是步驟說明:

安裝步驟:

· 在Coverity開源平台(scan.coverity.com)上創建一個賬號,配置一個項目(否則你無法查看相關報告)。

· 下載與你所使用操作系統一致的Coverity編譯獲取包,解壓。

運行:

· 在編譯指令前加上cov-build和中間捕獲文件目錄,比如我這裡就是一個build.bat腳本,做了如下修改:

<exec program="${coverity.exe}" commandline="--dir cov-int --encoding=UTF-8 build.bat build-release-platforms-x64" />

· 上傳並查看結果:

你需要把獲取到的中間結果信息上傳到Coverity網站,我的腳本如下(使用curl):

<exec program="${tools.folder}/7-Zip/7za.exe">

<arg value="a" />

<arg value="coverity.zip" />

<arg value="cov-int" />

</exec>

<exec program="${curl.exe}" commandline=--form token=${coverity.token} --insecure --form email=${coverity.email} --form file=@coverity.zip --form version="${ci.buildNumber}" --form description="${ci.buildNumber}" scan.coverity.com/build />

做完了之後就可以靜靜地等待分析結果。。。時間不確定,有可能很快出來,也可能比較慢,開源項目的掃描次數,規模和頻率都有限制。然後就Have Fun,來修Bug吧~

譯者題外話:另外安利幾個Coverity Scan能夠找到的典型問題,這幾個問題比較早,因為都是C/C++/Java的,現在Coverity支持的地址在:scan.coverity.com/o/oss

還有,Coverity Cloud Scan需要把源代碼上傳到國外的,如果你在國內想用的話,還是直接來找我吧。。。

OpenCover與SonarQube

SonarSource團隊提供了一個免費的質量檢測和管理平台SonarQube (也支持在線的儀錶板,目前還不支持Windows編譯平台,所以Windows用戶需要額外的工作)。

SonarQube的檢測結果冗長且迂腐(原詞是verbose/pedantic,實在不知道怎麼翻譯…),找到了13個與OWASP相關,由Console.WriteLine語句導致的高等級(Critical)漏洞,但是OpenCover是個桌面程序,所以這些問題被標記成了False Positive(誤報)後忽略。

但我們仍然在找一個SonarQube的最佳使用實踐。平心而論,把SonarQube報告出來的問題忽略掉很容易,因為很多檢測出來的問題屬於簡單的編程風格建議,沒必要修復。SonarQube也允許使用者查看所有檢測規則,然後基於自己的需求進行配置和修改。有時候我們也會對比一下Coverity的結果,看是否找到了相同的問題。

有一條我習慣性關掉的規則叫做「字元後綴應該是大寫」,這是一個低等級的檢測規則,在使用整數和浮點數時需要使用0M或者0F,而不是0m或者0f,但是後者更容易讀寫。當然SonarQube也對規則提供了說明,比如使用大寫字元後綴能夠避免1和字母L小寫時候的混淆(0l與01),這個時候比較有用,但是其他的情況下會讓程序員非常苦惱,因為要在大小寫之間變來變去。有一些可選的字體能夠讓你很輕鬆的分辨出1和l,Coverity的最新版本也支持定製這一類代碼規範,這樣就節省了更多的時間。

我確實發現SonarQube比起Coverity,在使用與維護上要麻煩的多,因為我需要自己建立搭建整套環境和維護(而且由於整體開源,研發人員數也不夠,所以技術支持上非常不給力)。初始環境搭建的過程中我用了一個內置資料庫,但是比較難用,所以後來使用了Mysql+SonarQube安裝,以下是Windows上的安裝步驟。

  • 安裝/升級JRE
  • 下載,解壓和安裝Sonarqube
  • 下載,解壓和安裝Sonar Csharp 插件
  • 下載,解壓並安裝 MSBuild.SonarQube.Runner

運行:

  1. 運行startsonar.bat
  2. 運行 Visual Studio Developer Prompt 2013/5
  3. 查看結果: 進入 http://localhost:9000 並查看

總結 - 譯者有話說

由於有太多的人問我Coverity與SonarQube有什麼區別,如何選擇。想來想去,最終決定翻譯這篇文章,用OpenCover項目的實際狀況來進行對比說明-這是一個典型的研發團隊對比場景。作為靜態代碼分析工具來說,SonarQube免費,開源,但幾乎所有的代碼靜態分析插件都是開源或者第三方工具,並沒有核心的技術,所以一方面找到的問題非常初級,誤報率非常高,導致研發人員拒絕使用這些結果。另一方面,使用它的研發團隊遇到問題後幾乎無法及時得到技術支持。反觀Coverity,從斯坦福實驗室走出來後,矽谷的技術不斷引領著代碼靜態分析行業領域創新,誤報率從20%到10%甚至更低,規則集也在不斷增強(達到了近兩千條),所以幾乎所有的軟體研發團隊最終都選擇放棄SonarQube,改用Coverity,區別只是時間早晚的問題。當然我不會說你必須選擇哪一個工具,我們也同樣推薦Coverity與SonarQube同時並存的使用方式。不過從業8年來,我們已經替換/進入了大部分使用SonarQube的團隊,比如聯想,小米,某Top2 電商企業,百度…

Synopsys最近也發布了最新版本的Coverity代碼靜態分析平台,擴展了該工具對新編程語言、編碼標準以及開發工具集成的支持,也實現了SonarQube的絕大部分功能-代碼規範與規則自定義。Coverity 2018.01亮點:

l 支持Scala和VB.NET編程語言

l 全面支持SEI CERT C編碼標準規則(2016 版)

l 支持PHP語言與Objective-C的安全性檢測,增強ASP,JSP,JavaScript,Android上的安全性檢測。

l 擴展的編程語言覆蓋範圍:即使企業擴展其軟體組合,採用新的語言、架構及技術,比如移動和微服務,Coverity也能幫助企業在應用程序中主動構建安全性和質量。2018.01增加了對兩種新語言的支持:通常用於基於微服務的應用程序開發的Scala和VB.NET。最新發布的Coverity還為Swift、PHP、Python、JavaScript、Java、C#和Node.js編程語言提供增強的安全分析。通過這些新增功能,Coverity支持用於構建嵌入式和企業級軟體的關鍵程序語言。

l 支持安全編碼標準:Coverity幫助企業遵循編碼標準,提升關鍵嵌入軟體的安全性及可靠性。隨著最新版本的發布,Coverity 2018.01全面支持SEI CERT C (2016 版)-安全編碼的行業標準。除了CERT C,Coverity也支持MISRA編碼標準的所有版本,並通過了ISO 26262認證。另外新版本也發布了代碼規範編寫的框架(CodeXM),用戶可以自行定義代碼規範與編碼標準。

l 與現代開發工具鏈的集成:Coverity支持並集成許多常用的開發工具,以助力實現快速和自動化的開發工作流程。Coverity 2018.01為最新的集成開發環境(IDEs)提供插件,包括Visual Studio、Eclipse、IntelliJ和Android Studio等等。為了優化安全測試,最新版本還藉助Jenkins持續集成(CI)伺服器,以支持開箱即用的集成。Coverity新的Jenkins插件進一步完善了Jenkins Pipeline工作流框架,可以按項目檢索發現問題,並增強了數據過濾功能。

關於譯者-韓葆

韓葆(Bob Han),Synopsys SIG 軟體質量與安全產品線業務負責人/高級安全方案架構師。曾在Sun中國研究院為OpenSolaris操作系統搭建測試平台,專註軟體質量與安全測試領域,深入研究白盒測試、靜態分析、網路協議Fuzzing、滲透測試等技術。經歷了研發測試行業和軟體安全行業在中國從無到有,從小到大的整個過程。2013年作為中國區首席工程師加入Coverity(2014年被Synopsys收購),成功的將靜態分析技術引入中國,在2014-2017年四次作為中國質量競爭力大會演講嘉賓介紹代碼靜態分析與軟體安全測試技術,並多次被軟體安全領域高峰論壇如Qcon, OWASP, ItClub等邀請為嘉賓分享行業動態,致力於軟體團隊的研發測試與軟體安全平台搭建,改善軟體質量,提高軟體安全性。

如果你想要使用Coverity,請直接聯繫:15210834682(微信同電話),Bao.Han@synopsys.com

招聘信息

在合作夥伴和朋友們的要求下,我這裡義務為各大互聯網/非互聯網企業招聘測試開發人員,主要是整體的質量與安全平台搭建、支持、溝通、維護工作,面向的團隊包括百度工程效率中心、小米工程效率中心、京東能效管理平台等企業,如果你有興趣,也歡迎加我微信投遞簡歷。

u.wechat.com/EHpJ1uyi-R (二維碼自動識別)

長按二維碼加我微信


推薦閱讀:

AI 代碼長啥樣?
【實驗】Adversarial Video Generation

TAG:信息安全 | 軟體安全 | 代碼 |