官术网_书友最值得收藏!

2.2 軟件缺陷分類

以前述研究為基礎(chǔ),軟件缺陷學(xué)領(lǐng)域?qū)W者進一步對軟件缺陷分類進行了大量研究,獲得了多種軟件缺陷分類法。根據(jù)軟件缺陷屬性進行軟件缺陷分類也是研究軟件缺陷的基礎(chǔ)。目前軟件缺陷分類有基于缺陷起源、基于缺陷性質(zhì)、基于對用戶的影響、基于缺陷等級、基于缺陷發(fā)現(xiàn)的測試環(huán)節(jié)、基于故障產(chǎn)生位置等多種方法,每種分類方法都有自己的關(guān)注點。這里主要介紹應(yīng)用比較廣泛的基于缺陷性質(zhì)的分類和ODC,其中ODC本質(zhì)上是一種缺陷分析方法,由Ram Chillarege和他的同事基于在IBM的工程實踐于1992年提出。ODC通過給每個缺陷添加一些額外的屬性,利用對這些屬性的歸納和分析來反映產(chǎn)品設(shè)計、代碼質(zhì)量、測試水平等方面的問題,從而得到一些辦法來對工作進行改進。例如,對于測試團隊,通過ODC可以知道測試工作是否變得更加復(fù)雜;每個測試階段是否利用了足夠多的觸發(fā)條件來發(fā)現(xiàn)缺陷;退出當(dāng)前測試階段有什么風(fēng)險;哪個測試階段做得好,哪個測試階段需要改進等。對于開發(fā)團隊,利用ODC可以知道產(chǎn)品設(shè)計和代碼編寫的質(zhì)量情況。采用ODC方法可以提高用戶滿意度,減少產(chǎn)品投入市場后的維護花費。這種方法也是目前使用最多、影響最廣的缺陷分類方法之一。

表2.1所示為幾種典型軟件缺陷分類法簡介,主要包括基于缺陷性質(zhì)的分類和立體分類。立體分類是指采用多個正交屬性來刻畫缺陷,以最大限度地獲得語義并在此基礎(chǔ)上實施度量的缺陷分類方法。基于缺陷性質(zhì)的分類的代表分類法包括Goel軟件缺陷分類法和Thayer軟件缺陷分類法;立體分類的代表分類法包括ODC和IEEE軟件缺陷分類法。

表2.1 幾種典型軟件缺陷分類法簡介

續(xù)表

2.2.1 Goel軟件缺陷分類法

Goel軟件缺陷分類法是一種按照缺陷性質(zhì)分類的方法。這種分類法可以顯示缺陷的屬性,以及各類缺陷的比例,因此有助于加深對缺陷發(fā)生規(guī)律的認識,并有助于尋求避免缺陷產(chǎn)生的方法。Goel軟件缺陷分類法將軟件缺陷分為語法缺陷、語義缺陷、運行缺陷、說明缺陷、性能缺陷五大類別。

1.語法缺陷

語法缺陷是指程序不符合編程語言的語法規(guī)則所造成的缺陷。語法缺陷可以用目察的方法發(fā)現(xiàn),也可以用編譯程序中的語法分析程序和詞法分析程序在上機編譯時發(fā)現(xiàn),這類缺陷最容易察覺,并且大多出自缺乏經(jīng)驗的程序員之手。

2.語義缺陷

語義缺陷是指程序不符合計算機環(huán)境的語義分析程序要求所造成的缺陷。常見的語義缺陷有類型檢查缺陷、執(zhí)行限制缺陷。這些缺陷可以用目察的方法發(fā)現(xiàn),也可以在上機編程時發(fā)現(xiàn)。

3.運行缺陷

運行缺陷是指在程序?qū)嶋H運行中發(fā)生的缺陷,這些缺陷又分為以下三類。

(1)定義域錯誤:是指程序變量值超出變量說明規(guī)定的范圍,或者超出硬件描述的物理極限。變量說明有隱式和顯式兩種。例如,Pascal語言可以用枚舉或子域來說明變量值的范圍。有的編譯程序能產(chǎn)生檢查定義域錯誤的運行代碼,有的編譯程序?qū)Χx域錯誤有恢復(fù)功能。某些語言(如Pascal)的編譯程序能自動檢查超出變量說明規(guī)定的范圍的變量值,但是用有的語言(如Fortran)編制的程序,在運行中一旦出現(xiàn)定義域錯誤,程序便中斷執(zhí)行。定義域錯誤是一種嚴重的錯誤,它會使程序給出錯誤的結(jié)果,使程序中斷執(zhí)行。對于實時系統(tǒng),程序中斷執(zhí)行可能造成非常嚴重的后果。

(2)計算錯誤:是指程序給出錯誤的輸出。計算錯誤又稱為邏輯錯誤,由計算公式的錯誤、控制流的錯誤、變量的賦值錯誤及參數(shù)錯誤等原因產(chǎn)生。在程序執(zhí)行過程中,不可能產(chǎn)生測定計算錯誤的運行代碼,因為計算錯誤是由程序輸出和程序說明之間的偏離所造成的,現(xiàn)有的軟件測試技術(shù)無法保證消除全部計算錯誤。

(3)非終止錯誤:是指在沒有外界干預(yù)的情況下,程序無法終止運行。在非終止錯誤中,最常見的是程序進入無限循環(huán)。如果一組并行的程序陷入死鎖狀態(tài),也可能出現(xiàn)非終止錯誤。在軟件測試中,通常通過執(zhí)行程序中的循環(huán)語句來查找無限循環(huán)。這個方法不能保證消除無限循環(huán),因為某些無限循環(huán)只有在變量達到特定值時才發(fā)生。

4.說明缺陷

說明缺陷是指由需求說明與用戶陳述要求不符,或者用戶陳述要求與用戶實際要求不符所造成的缺陷。目前還沒有完善的方法可用來檢查和消除說明缺陷,因為沒有一種非常有效的需求規(guī)格說明語言,能夠?qū)⒂脩舻男枨蠓g成清晰、完備和一致的術(shù)語。說明缺陷又分為三類:不完全說明、不一致說明、多義性說明。

5.性能缺陷

性能缺陷是指程序的實際性能與要求的性能之間出現(xiàn)差異。程序的性能一般可通過以下幾個方面來衡量:響應(yīng)時間、運行時間、存儲空間、工作區(qū)要求等。

2.2.2 Thayer軟件缺陷分類法

Thayer軟件缺陷分類法是另一種按照缺陷性質(zhì)分類的方法。Thayer軟件缺陷分類法中用于缺陷分類的原始信息是軟件測試和使用中填寫和反饋的軟件問題報告,因此Thayer軟件缺陷分類法中包括不屬于軟件本身的缺陷,如操作系統(tǒng)及系統(tǒng)支持軟件的缺陷或操作員缺陷。

Thayer軟件缺陷分類法的特點是類別詳細,適用于各種類型的程序。Thayer軟件缺陷分類法包括下列16種類型。

(1)計算缺陷:指從程序方程的代碼中產(chǎn)生的缺陷。

(2)邏輯缺陷:指設(shè)計程序時出現(xiàn)的邏輯上的錯誤,如錯誤的通路、錯誤的循環(huán)、死循環(huán)、錯誤的邏輯、錯誤的判斷條件,以及沒有對旗標(biāo)和規(guī)定的數(shù)據(jù)值進行檢驗等。

(3)輸入/輸出缺陷:指由程序輸入/輸出語句產(chǎn)生的缺陷,如輸出格式、輸出位置及輸出數(shù)據(jù)的完備性不符合要求等。

(4)數(shù)據(jù)加工缺陷:指在數(shù)據(jù)的讀寫、移動、存儲和變更時發(fā)生的缺陷。

(5)操作系統(tǒng)及系統(tǒng)支持軟件的缺陷:指在程序運行時,控制、支持程序運行的軟件產(chǎn)生的缺陷。這些缺陷不屬于程序本身,需要把它們和程序本身的缺陷區(qū)別開。在Thayer研究的三個軟件項目中,這一類型的缺陷數(shù)量很少。

(6)配置缺陷:指軟件經(jīng)過修改后發(fā)生的,不能與操作系統(tǒng)或其他應(yīng)用軟件兼容的缺陷。這類缺陷會導(dǎo)致災(zāi)難性的后果,它們往往是由趕進度、違背配置管理規(guī)則造成的。

(7)接口缺陷:指在程序與分程序的接口、程序與系統(tǒng)軟件的接口、程序與數(shù)據(jù)庫的接口、程序與用戶的接口處所發(fā)生的缺陷。

(8)用戶需求改變:指在程序投入使用后,用戶對軟件功能提出的新需求使程序無法適應(yīng)。

(9)預(yù)置數(shù)據(jù)庫缺陷:指在數(shù)據(jù)庫中,預(yù)置變量初始值的錯誤和常數(shù)的錯誤。

(10)全程變量缺陷:指適用于全部程序的變量或常數(shù)的錯誤。

(11)重復(fù)缺陷:指重復(fù)發(fā)生的同樣的缺陷。Thayer軟件缺陷分類法把重復(fù)缺陷作為一個專項列出,借以從數(shù)量上考察缺陷重復(fù)發(fā)生的可能性。

(12)文檔缺陷:指軟件文檔中存在的缺陷。

(13)需求一致性缺陷:指軟件偏離需求規(guī)格說明而產(chǎn)生的缺陷。

(14)性質(zhì)不明的缺陷:指根據(jù)已有信息,無法判明其性質(zhì)的缺陷。

(15)操作員缺陷:指在操作員或測試人員運行程序時產(chǎn)生的人為缺陷。

(16)問題:指軟件問題報告中提出的需要答復(fù)的問題。

Thayer軟件缺陷分類法中,在16種類型之下,還有164個子類別,詳細內(nèi)容參見文獻[9]。

2.2.3 層次化軟件缺陷分類法

經(jīng)驗表明,通過代碼審查能夠有效地發(fā)現(xiàn)軟件中30%~70%的邏輯設(shè)計和編碼缺陷。IBM通過使用代碼審查方法發(fā)現(xiàn),缺陷的檢測效率高達全部查出缺陷的80%。Myers的研究發(fā)現(xiàn),代碼審查和代碼走查平均能查出全部缺陷的38%。在某些情況下,代碼審查可以比動態(tài)測試更有效地發(fā)現(xiàn)某些特定類型的缺陷,并且實施無需特別條件,成本較低。對代碼缺陷進行分類并收集實例是有效實施代碼審查的基礎(chǔ)。目前已有很多針對軟件缺陷分類的研究,但權(quán)威、實用且專門針對代碼審查階段的軟件缺陷分類標(biāo)準(zhǔn)較少,不利于對實際審查工作進行指導(dǎo)或為開發(fā)人員提供良好的編程準(zhǔn)則。各個開發(fā)和測評單位使用的缺陷分類方法缺乏統(tǒng)一標(biāo)準(zhǔn),導(dǎo)致數(shù)據(jù)收集質(zhì)量和共享使用效率較低。本節(jié)介紹層次化軟件缺陷分類法,并將其范圍限定為代碼級,其他層級的軟件缺陷分類方法將在后續(xù)章節(jié)討論。

程序由符號序列組成,詞法缺陷即符號序列在組成程序時可能出現(xiàn)的問題。組成程序的上述符號可以進一步作為語句和聲明的序列,在更大單元的過程,如符號組成過程中,可能出現(xiàn)不符合編程語言語法規(guī)則的問題,即語法缺陷。即使編程時避免了以上兩類缺陷,程序仍然可能與編程者實際想表達的意思不一致,即產(chǎn)生語義缺陷。語義缺陷可以分為內(nèi)存使用缺陷、指針使用缺陷、計算缺陷、數(shù)據(jù)加工缺陷和控制流缺陷等。可維護性缺陷是專門考察程序注釋問題和變量、語句多余問題的缺陷類型。在此分類基礎(chǔ)上,本節(jié)給出缺陷產(chǎn)生原因和缺陷影響分析,為缺陷預(yù)防提供依據(jù)。本節(jié)總結(jié)的缺陷類型基于航空型號軟件的測試經(jīng)驗,編程語言為C語言和一些匯編語言,詳細的缺陷分類如表2.2所示,其中A表示筆誤;B表示違反編碼風(fēng)格或標(biāo)準(zhǔn);C表示設(shè)計缺陷;D表示表意不清;E表示對某些應(yīng)用場景欠考慮;F表示理解錯誤。

表2.2 詳細的缺陷分類

續(xù)表

續(xù)表

2.2.3.1 詞法缺陷

詞法缺陷主要關(guān)注程序的基本組成單元,即符號的錯誤使用。第一個字符是數(shù)字0的整型常量被視為八進制數(shù)。有時在上下文中為了使格式對齊,可能將十進制數(shù)寫成八進制數(shù)。例如:

2.2.3.2 語法缺陷

語法缺陷關(guān)注符號在組成聲明、表達式、語句和程序時產(chǎn)生的錯誤。

1.預(yù)處理缺陷

(1)宏參數(shù)未用括號圍起問題。例如:

考慮如下例子:

而程序本意是要得到(2+6)×7=56。

(2)宏展開式未用括號圍起問題。例如:

考慮如下例子:

而程序本意是要得到(5+5)×(5+5)=100。

(3)使用宏定義產(chǎn)生副作用問題。例如:

一種錯誤的使用情況如下:

如果++j的結(jié)果不小于k,則j會遞增2次,而這可能與編程人員的本意不一致。

2.其他缺陷

(1)遺漏分號問題。例如:

return語句后遺漏了一個分號,但這段代碼仍然能通過編譯,并將logrec.date=x[0];作為return的操作數(shù)。若代碼所在函數(shù)聲明的返回值為void,則編譯器會因為實際返回值類型與函數(shù)聲明返回值類型不一致而報錯。當(dāng)函數(shù)不需要返回值時,有些編譯器會默認函數(shù)返回值類型為int,編譯器將無法檢測到錯誤。

(2)遺漏程序分支的返回值問題。在下例中,b為1的分支返回值未定義,因此當(dāng)執(zhí)行到該分支時,程序的結(jié)果是不確定的。

2.2.3.3 語義缺陷

即使程序的詞法和語法都無缺陷,程序仍然可能無法表達編程者原本的意思,即產(chǎn)生語義缺陷。

1.內(nèi)存使用缺陷

內(nèi)存使用缺陷主要指內(nèi)存的讀寫沖突問題。例如:

中斷服務(wù)程序insert從硬件端口讀一組字符到數(shù)組中,程序remove將這些字符刪除。因為remove執(zhí)行時沒有關(guān)中斷,中斷服務(wù)程序?qū)⒏蓴_remove的正常執(zhí)行,可能導(dǎo)致嚴重后果。

2.指針使用缺陷

(1)未對某指針是否為空做判斷問題。例如:

在執(zhí)行后兩句代碼之前未對str是否為空做判斷。若malloc執(zhí)行失敗,則將導(dǎo)致str為空指針,使后兩句代碼無法正常執(zhí)行。因此,應(yīng)在char*str=malloc(1024);后加條件判斷語句if(str!=null),再執(zhí)行后面的語句。

(2)錯誤地使用“野指針”問題。“野指針”不是NULL指針,而是指向“垃圾”內(nèi)存的指針。指針p指向的內(nèi)存被釋放后未置為NULL,讓人誤以為p是合法指針。free操作釋放指針?biāo)竷?nèi)存,而沒有清除指針本身。通常用語句if(p!=NULL)進行防錯處理,但此時if語句無法起到防錯作用,因為即使p不是NULL指針,它也不指向合法內(nèi)存塊。例如:

3.計算缺陷

(1)判浮點數(shù)相等問題。浮點數(shù)在計算機中的二進制表達方式?jīng)Q定了大多數(shù)浮點數(shù)都無法精確表達,并且浮點數(shù)的計算精度有限。在進行浮點運算時,浮點數(shù)的計算精度限制通常會導(dǎo)致運算結(jié)果與實際期望結(jié)果之間有誤差。因此,要避免浮點型變量之間的“==”或“!=”比較,一般的做法是將兩個浮點數(shù)相減,然后與允許誤差進行比較來確定這兩個浮點數(shù)是否相等。

(2)精度損失問題。要謹防各類數(shù)值型數(shù)據(jù)混合運算產(chǎn)生精度損失。例如,double型數(shù)據(jù)向float型數(shù)據(jù)轉(zhuǎn)換及浮點型數(shù)據(jù)向整型數(shù)據(jù)轉(zhuǎn)換都會產(chǎn)生精度損失。

4.數(shù)據(jù)加工缺陷

數(shù)據(jù)加工缺陷主要是指循環(huán)控制變量類型與其使用形式不一致問題。例如:

在上例中,當(dāng)參數(shù)b的值大于127時,由于循環(huán)變量i為char型數(shù)據(jù),經(jīng)轉(zhuǎn)換后其值變成負數(shù)(char型數(shù)據(jù)的范圍為[-128,127]),導(dǎo)致循環(huán)無法進入。

5.控制流缺陷

正確的控制流能保證程序有序、正常地執(zhí)行。對控制結(jié)構(gòu)的不正確使用將導(dǎo)致非預(yù)期的代碼執(zhí)行,并且可能導(dǎo)致危險狀況的發(fā)生。

(1)中斷處理缺陷。中斷服務(wù)程序是實時系統(tǒng)的重要組成部分。系統(tǒng)通過中斷機制與外部環(huán)境通信并對外部事件做出響應(yīng)。當(dāng)中斷來臨時,CPU暫時停止當(dāng)前程序的執(zhí)行轉(zhuǎn)而處理中斷服務(wù)程序。

①發(fā)送/應(yīng)答類型的程序在函數(shù)異常返回前未完成必要工作問題。例如:

當(dāng)if條件滿足時,程序直接返回而不執(zhí)行后兩條語句。此時,程序即使成功從外部取到數(shù),也不對外部發(fā)數(shù)硬件進行應(yīng)答,從而導(dǎo)致硬件死等。

②中斷現(xiàn)場保護問題。當(dāng)出現(xiàn)中斷時,應(yīng)將CPU的當(dāng)前狀態(tài),即中斷的入口地址保存到堆棧中,轉(zhuǎn)而執(zhí)行其他任務(wù)。其他任務(wù)執(zhí)行完成后,從堆棧中取出中斷的入口地址繼續(xù)執(zhí)行。中斷現(xiàn)場保護就是保護中斷前一時刻的狀態(tài)不被破壞。

(2)其他缺陷。其他缺陷主要是指未對不可重入函數(shù)進行保護問題。函數(shù)重入是指由于外部因素或內(nèi)部調(diào)用,在一個函數(shù)沒有完成一次執(zhí)行的情況下,又一次進入該函數(shù)使其重新執(zhí)行。可重入函數(shù)必須保證資源互不影響地使用,以保證被多個任務(wù)調(diào)用而不會導(dǎo)致數(shù)據(jù)被破壞。

本書采用控制變量加以保護,使函數(shù)不可重入(不能保證資源,如全局變量、系統(tǒng)資源等互不影響地被使用)。例如:

2.2.3.4 可維護性缺陷

可維護性缺陷關(guān)注程序注釋問題和變量、語句多余問題。在本書中,變量多余是指變量被定義后,在后續(xù)代碼中未被使用(未參與計算或邏輯運算);語句多余是指不影響程序功能(或性能)的冗余代碼。

2.2.3.5 實例應(yīng)用

代碼審查單是代碼審查中使用的主要工具,是對缺陷探測經(jīng)驗的總結(jié),通常包括一系列表示為問題形式的典型缺陷和實例,用于指導(dǎo)審查員對代碼進行分析。基于上文對缺陷的分類得到代碼審查單,如表2.3所示。其中,各審查項對應(yīng)的缺陷實例可以參考上述內(nèi)容。

表2.3 代碼審查單

上述代碼審查單已投入實際代碼審查使用。表2.4列出了某航空型號軟件測試項目代碼審查階段根據(jù)該審查單發(fā)現(xiàn)的各類缺陷個數(shù)和各重要度等級的缺陷個數(shù)。由表2.4可見,語義缺陷的重要度等級較高,由于它們直接影響程序的可靠性和安全性,因此是審查重點。可維護性缺陷個數(shù)較多,但重要度等級不高,因為它們不直接影響程序的可靠性和安全性,僅對代碼維護產(chǎn)生影響。該測試項目代碼審查階段發(fā)現(xiàn)的缺陷類型可以被審查單中的缺陷類型覆蓋。在完成全部測試項目后,統(tǒng)計得到代碼審查階段發(fā)現(xiàn)的缺陷個數(shù)占全部缺陷個數(shù)的75%。審查結(jié)果表明,該代碼缺陷分類方法能有效指導(dǎo)實際代碼審查。

表2.4 某航空型號軟件代碼審查結(jié)果

續(xù)表

主站蜘蛛池模板: 全州县| 赫章县| 北碚区| 海南省| 宁晋县| 峨眉山市| 宾川县| 香港| 鹤山市| 青铜峡市| 平塘县| 金沙县| 云梦县| 乐昌市| 乌苏市| 尖扎县| 黔东| 恩平市| 修水县| 普兰店市| 凤山县| 丘北县| 临朐县| 金沙县| 怀远县| 和政县| 林口县| 望谟县| 二手房| 沁阳市| 汨罗市| 云林县| 凌海市| 邛崃市| 育儿| 二连浩特市| 台北县| 民权县| 嵩明县| 玛沁县| 聂拉木县|