Coverity公司位于美國加州舊金山,他們的產(chǎn)品包括Coverity Integrity Control、Coverity Static Analysis等一系列代碼分析工具與解決方案。日前,Coverity公司產(chǎn)品副總Ezi Boteach先生就“開發(fā)中測試”、代碼復(fù)查和開發(fā)人員最常犯的編碼錯誤接受了采訪。
問題:能否介紹下Coverity的“開發(fā)中測試”理念和你們的Development Testing Platform?
Ezi:“開發(fā)中測試”是新出現(xiàn)的一種技術(shù),包括一系列流程和軟件,例如靜態(tài)分析。開發(fā)中測試的目的是要幫助開發(fā)人員、管理層和業(yè)務(wù)人員能在開發(fā)周期的早期,找到并修復(fù)質(zhì)量和安全方面的問題,這些代碼還在開發(fā)之中,不會影響上市時間、成本或客戶滿意度。
“開發(fā)中測試”擴(kuò)大了傳統(tǒng)測試范圍,可以包括功能測試、性能測試和安全審核,為開發(fā)團(tuán)隊(duì)提供更快、更便捷的方式來測試代碼中的缺陷,而且是以非侵入的方式。這種方式下,開發(fā)人員能夠把注意力集中在創(chuàng)新上,管理層能夠在開發(fā)周期早期盡早了解問題以作出決策,業(yè)務(wù)人員能持續(xù)向市場交付高質(zhì)量的產(chǎn)品,獲得競爭優(yōu)勢。
問題:代碼復(fù)查是人們高度推薦的編程實(shí)踐。如果使用你們的產(chǎn)品,對于代碼復(fù)查,您有什么建議?
Ezi:代碼復(fù)查是軟件“開發(fā)中測試”很重要的部分,而且其成本很高,因?yàn)樾枰硪粋€開發(fā)人員來復(fù)審代碼,很多時候這個開發(fā)人員還必須是資深人員。在代碼復(fù)查之前先做靜態(tài)分析,這能讓代碼復(fù)審過程更快,而且成本更低。使用自動化分析來檢查變更以及于系統(tǒng)其他部分的集成點(diǎn),以此來識別和消滅代碼錯誤,代碼復(fù)審就可以更集中于邏輯和功能錯誤,而不是代碼的缺陷,這樣做更劃算,能夠自動化,而且易于重復(fù)。
我們推薦測試驅(qū)動開發(fā)所有的工具和實(shí)踐,包括代碼復(fù)審、單元測試和代碼覆蓋率。當(dāng)然,要是能和Coverity的自動化代碼測試工具一起使用就更好了。
問題:你們的產(chǎn)品如何與像xUnit這樣的工具一起配合使用?
Ezi:單元測試是“開發(fā)中測試”的重要組成,需要支持測試驅(qū)動開發(fā)。使用Coverity 5.5,我們引入了“開發(fā)中測試”的平臺,能夠讓多種不同工具與測試工作流集成。目前我們還不能專門與xUnit集成在一起,但是我們的客戶現(xiàn)在能夠很方便地把他們使用的測試工具與Coverity Development Testing平臺集成。舉個例子:Coverity 5.5.1版本包括與常用Java靜態(tài)分析工具FindBugs的集成。這樣的集成讓管理人員能夠降低維護(hù)多個測試工具的成本,并通過統(tǒng)一的工具來推行策略。開發(fā)人員也有統(tǒng)一的界面來查看缺陷,并排定解決的優(yōu)先級。
問題:你們的產(chǎn)品是否能與持續(xù)交付流程集成?
Ezi:Coverity Static Analysis可以與多個構(gòu)建系統(tǒng)集成,包括Jenkins這個常用的持續(xù)集成系統(tǒng)。一般來說,與Jenkins和持續(xù)集成系統(tǒng)的集成是為了確保所有的持續(xù)構(gòu)建都能運(yùn)行自動化代碼測試工具。如果分析中發(fā)現(xiàn)了新的缺陷,一個構(gòu)建版本就是失敗的。這確保新的缺陷不會引入到交付的軟件的主干代碼中,而交付過程是持續(xù)交付流程的一部分。這也能保證失敗的構(gòu)建版本不會進(jìn)入流程的下一個階段,一般來說是QA階段。Coverity就像是交付過程中的一道閘門。
問題:除了使用你們的產(chǎn)品,您是否還能為開發(fā)人員和架構(gòu)師提供一些其他的原則與實(shí)踐?
Ezi:確保軟件的質(zhì)量,防止安全漏洞,這需要良好協(xié)作、工具和開發(fā)流程管理這幾方面的結(jié)合。從清晰的需求文檔開始,這是開發(fā)任何新功能的基礎(chǔ)。需求文檔之后,就是功能和系統(tǒng)架構(gòu)師完成的功能和需求設(shè)計(jì)。代碼開發(fā)完成后,“開發(fā)中測試”應(yīng)該是這個流程的有機(jī)部分。不僅僅是一個產(chǎn)品,而應(yīng)該是流程和技術(shù)的組合,幫助開發(fā)組織在開發(fā)周期早期、撰寫代碼的時候,就能修復(fù)軟件的問題,確保代價高昂的缺陷不會進(jìn)入后續(xù)階段和生產(chǎn)環(huán)境。
架構(gòu)師要確保軟件的架構(gòu)良好。這需要人工復(fù)審和架構(gòu)分析,此外還要有經(jīng)過考驗(yàn)的軟件開發(fā)方法論。與之類似,開發(fā)人員也要保證,除了使用靜態(tài)和動態(tài)分析的自動化測試之外,也要使用代碼復(fù)審和單元測試。質(zhì)量保證(QA)是任何軟件開發(fā)過程中都很重要的階段,以確保功能測試和性能測試順利通過。最后,安全審核也很重要,保證在識別、修復(fù)、移除代碼缺陷時不會帶入新的安全漏洞。
問題:根據(jù)Coverity收集的數(shù)據(jù),您能否列舉一些開發(fā)人員最常犯的錯誤?
Ezi:開源項(xiàng)目SCAN(scan.coverity.com)能夠很好地發(fā)現(xiàn)開發(fā)人員常犯的錯誤。從2006年開始,Coverity與美國國土安全部一起,研發(fā)了Coverity SCAN項(xiàng)目,來保證開源軟件的安全性和完整性。Coverity SCAN分析了超過290個開源項(xiàng)目,包括Linux、Apache、PHP和Android,識別出49,654個缺陷,開源軟件開發(fā)人員已經(jīng)修復(fù)了超過15,000個缺陷。蝦米的表格就展示出了開源軟件中最常出現(xiàn)的缺陷,商業(yè)軟件也與之類似。
| SCAN項(xiàng)目中的出現(xiàn)頻率 | 風(fēng)險(xiǎn)程度 |
NULL指針引用 | 27.60% | 中 |
資源泄露 | 23.19% | 高 |
非原意圖表達(dá)式 | 9.76% | 中 |
讀未初始化的值 | 8.41% | 高 |
釋放后使用 | 5.91% | 高 |
緩沖區(qū)溢出 | 5.52% | 高 |
很重要的一點(diǎn)要指出:像NULL指針引用、內(nèi)存泄露和緩沖區(qū)溢出常常會帶來很嚴(yán)重的質(zhì)量和安全風(fēng)險(xiǎn)。很多這樣的缺陷,使用傳統(tǒng)的測試方法,有時難以找到。使用Coverity的工具會更易于發(fā)現(xiàn)類似問題。
要想了解更多關(guān)于SCAN項(xiàng)目的信息,可以訪問 2010 SCAN報(bào)告,其中包括對于Android核心代碼的分析結(jié)果。
問題:對于代碼分析可視化的重要性,程序員們認(rèn)識得越來越明白了。您能否列出3個最重要的相關(guān)分析圖?
Ezi:Coverity的Development Testing平臺能以代碼可視化形式讓開發(fā)人員和管理層看到代碼的質(zhì)量。可視化能夠在幾個方面起到幫助作用:它有助于標(biāo)識代碼的所有者和缺陷,能幫助展示出軟件代碼的整體可讀性,以及質(zhì)量和安全風(fēng)險(xiǎn)較高的代碼區(qū)域,還能有助于推行代碼完整性的檢查策略。
只談3個圖很困難,但我想選的是:未解決的缺陷與已解決的缺陷的對比、每個軟件組件中的缺陷個數(shù)、新的Integrity Control熱度圖。