遇到代碼缺陷不要慌,立刻教你快速檢測和修復

摘要:人類思惟中總存在缺陷,寫出的代碼同樣會存在缺陷,致使軟件系統出現不符合預期的行爲。本文討論了軟件缺陷的定義、分類、檢測和修復。

人類思惟中總存在缺陷,寫出的代碼同樣會存在缺陷,致使軟件系統出現不符合預期的行爲。自動化地檢測和修復缺陷是提升軟件開發效率和軟件質量的重要手段。本文討論了軟件缺陷的定義、分類、檢測和修復。編程

軟件缺陷與其分類

計算機學科中的中文詞彙不少是從英文翻譯過來的,有時不可以準確地描述或刻畫詞彙真實的含義。在軟件領域,你能想到的和缺陷相關的詞彙可能有:bug,defect,fault,error,failure,exception等等。說實話,我一直也沒搞懂這些詞彙的區別。但理解這些詞彙的區別不只僅是文字遊戲,也可以幫助咱們理解針對它們的檢測和修復技術的不一樣。因而我google了一下,但大多文章對這些詞彙的定義都不太一致。如下是我比較認同的這些詞彙在軟件代碼上的定義。segmentfault

· Fault/Bug:軟件中出現不符合業務邏輯的代碼,好比+號寫成-號;機器學習

· Error:軟件運行中出現不符合預期的值,好比a的值爲2,被計算成3;工具

· Failure:軟件與人的交互中出現不符合預期的行爲,好比程序崩潰。所以Fault可能致使Error,最終可能致使Failure,注意這裏是可能,並非必定;學習

· Defect:一種Defect是一類代碼自身缺陷的統稱(概括),好比內存泄漏。測試

Fault一般須要從Error,Failure中檢測到,也就是比較程序的執行結果與預期的規範(Specification)是否吻合。這個過程其實就是debugging(調試)和testing(測試)。Fault也能夠稱爲業務邏輯相關的缺陷。而Defect是代碼自己的問題,不依賴於執行結果和預期的規範的一種軟件問題,所以Defect一般是經過靜態地掃描(不運行)代碼來檢測的。google

缺陷的檢測和修復現狀

從上文能夠看到,Fault是經過測試來檢測的,而Defect是經過靜態分析來檢測。在企業中,Fault檢測的普及率和承認度一般比Defect檢測的高,主要緣由有以下幾點:編碼

(1)Fault會直接影響軟件的行爲,被視爲比較嚴重的問題,而不少Defect不能直接影響軟件的行爲,或者在很特殊的場景下才影響軟件的行爲,開發人員以爲無關緊要;翻譯

(2)Fault引發的軟件錯誤容易被觀測,有直接證據證實軟件中存在錯誤,開發人員會傾向去修改,而Defect一般比較難觀測;debug

(3)測試的門檻低一些,測試人員只須要寫一些測試腳本就能夠,但靜態分析須要有程序分析方面技術的積累;

(4)靜態分析固有的一些缺點(耗時,誤報)引發開發人員的不滿。

自動修復方面,這幾年在學術界比較熱門,慢慢也在企業中開始使用,但目前應該還處於初級階段。與檢測相反,Fault的自動修復難度是比較大的,由於涉及到業務邏輯,須要人工加入一些邏輯,固然最近也有不少學術研究使用機器學習來自動學習Fault的自動修復;而不少的Defect的修復是不須要加入業務邏輯相關的代碼,因此自動化程度反而能夠達到較高水平,不過目前也沒有看到這方面的自動化工具。

Defect的檢測和修復的問題和展望

咱們不難發現,Fault的檢測已經比較成熟;而Defect的檢測受重視程度還不夠。之前咱們可能只關注軟件的正確性,因此Fault的檢測和修復比較受歡迎,但Defect也會影響軟件的質量,一樣須要受到關注。

最近公司在提倡提高軟件工程能力,打造高可信的軟件產品,也是強調咱們不只僅要關注軟件功能的正確性,也須要關注非功能方面的質量,寫出「優美」的代碼。所以,Defect的自動檢測和修復是一個比較有價值的方向,如下是一些可能作的事情:

(1)對開發人員增強Defect方面的培訓,讓開發人員瞭解常見的Defect,在編碼時儘可能地避免寫出這樣的Defect,這比後續的檢測和修復付出的代價要少不少。如今公司雖然有不少的編程規範定義不一樣的Defect,但開發人員可能並無用心去學習,如何讓開發人員意識到Defect的危害是比較關鍵的;

(2)增強代碼的Review的機制。這一點我我的深有體會:沒有Review時,寫的代碼就比較隨意,有Review時就會考慮得全面一些,畢竟要給別人看;

(3)Defect的自動檢測。對於Fault的檢測,人比機器更擅長(好比寫測試用例),但對於Defect的檢測,機器比人更擅長(好比枚舉程序路徑),所以Defect的檢測是更適合自動化的。目前公司也引入了一些Defect的自動檢測工具,如coverity,fortify,findbugs等等,但這些工具一般只是做爲黑盒來使用。這樣可以覆蓋更多的Defect,同時也帶來一些問題:一樣的Defect實例被不一樣工具重複報告出來,新增一些Defect檢測規則比較難,處理Defect例外場景比較難。所以,咱們可能須要一個統一的Defect檢測工具。

(4)Defect的自動修復。Defect的檢測除了耗時和誤報外,另外一個不受歡迎的地方是開發人員不知道怎麼修復。所以,Defect的自動修復也是提升Defect受重視程度的一個有效途徑。並且,相比Fault的自動修復,Defect的自動修復對於機器而言是要簡單一些的,由於Defect的類別是有限的能夠枚舉的,同時Defect的性質是比較形式化不依賴於業務邏輯的。將來但願能開發出一個統一的Defect修復工具。

本文分享自華爲雲社區《遇到代碼缺陷不要慌,立刻教你快速檢測和修復》,原文做者:APTX-486977 。

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

相關文章
相關標籤/搜索