- 軟硬件綜合系統(tǒng)軟件需求建模及可靠性綜合試驗(yàn)、分析、評(píng)價(jià)技術(shù)
- 胡璇編著 工業(yè)和信息化部電子第五研究所組編
- 13字
- 2021-11-03 13:36:40
第2章 軟件缺陷、故障及失效
2.1 幾個(gè)基本概念
對(duì)軟件缺陷(Bug/Defect)、故障(Fault)、失效(Failure)的研究是軟件可靠性研究的基礎(chǔ),因此本章對(duì)上述概念進(jìn)行介紹。缺陷、故障、失效等詞匯的含義很相近,在軟件領(lǐng)域使用這些詞匯時(shí)更容易混淆。因此,在進(jìn)行討論之前,先對(duì)這些詞匯的含義分別進(jìn)行介紹。
1.軟件缺陷
軟件缺陷一詞最早出現(xiàn)在1945年的Annals年報(bào)中,并被稱為“Bug”。隨著軟件工程及軟件缺陷學(xué)的發(fā)展,產(chǎn)生了對(duì)軟件缺陷發(fā)展過(guò)程各個(gè)階段的定義,軟件缺陷也變?yōu)橛伞癉efect”來(lái)描述。然而,計(jì)算機(jī)應(yīng)用領(lǐng)域仍然沿用“Bug”來(lái)描述軟件缺陷。目前,軟件工程領(lǐng)域已普遍認(rèn)為軟件缺陷是軟件的一種固有屬性,并且可以通過(guò)修改軟件而消除。
ISO 9126將軟件缺陷定義為“Bug”,可分為兩類。
(1)Defect,其定義為未滿足期望的使用需求(the Nonfulfillment of Intended Usage Requirements)。
(2)Nonconformity,其定義為未滿足需求的準(zhǔn)確性(the Nonfulfillment of Specified Requirement)。
目前軟件缺陷學(xué)界將缺陷定義為“Defect”,其含義包括ISO 9126定義的“Bug”的所有內(nèi)容。此外,還有其他一些軟件缺陷定義,如能力成熟度模型(Capability Maturity Model,CMM)中對(duì)軟件缺陷的定義是系統(tǒng)或系統(tǒng)部件中能造成它們無(wú)法實(shí)現(xiàn)被要求功能的缺點(diǎn),若在系統(tǒng)執(zhí)行過(guò)程中遇到缺陷,則可能導(dǎo)致系統(tǒng)故障。
本書(shū)中對(duì)軟件缺陷的定義如下:軟件缺陷是指存在于軟件中的那些不希望出現(xiàn)或不可接受的偏差,其結(jié)果是軟件在運(yùn)行于某一特定條件時(shí)出現(xiàn)故障。當(dāng)軟件意指程序時(shí),軟件缺陷與軟件“隱錯(cuò)”(Bug)同義。
上述定義表明,軟件缺陷是軟件產(chǎn)品的靜態(tài)屬性,其表現(xiàn)為與預(yù)期不一致。軟件產(chǎn)品包括文檔和程序;與預(yù)期不一致包括軟件產(chǎn)品與用戶需求不一致、與軟件自身需求不一致、與隱含需求不一致。
2.軟件故障
當(dāng)運(yùn)行軟件時(shí)激活了軟件缺陷,可能導(dǎo)致軟件故障。在ISO/CD 10303-226中,軟件故障被定義為存在于組件、設(shè)備或子系統(tǒng)中異常的條件或缺陷,常常會(huì)導(dǎo)致系統(tǒng)失效。
本書(shū)中對(duì)軟件故障的定義如下:軟件故障是指軟件的運(yùn)行與規(guī)定不符,使軟件或其組成部分喪失了在規(guī)定的限度內(nèi)完成所要求的功能的能力。軟件只有在執(zhí)行一次任務(wù)時(shí)用到有缺陷的部分程序,才會(huì)發(fā)生故障,如果在執(zhí)行一次任務(wù)時(shí)未用到有缺陷的部分程序,則軟件仍能正確運(yùn)行。
3.軟件失效
軟件失效是指軟件故障使軟件不能完成規(guī)定功能,是一種外部行為結(jié)果。軟件故障不一定使軟件在執(zhí)行任務(wù)時(shí)失效。
本書(shū)中對(duì)軟件失效的定義如下:軟件失效泛指當(dāng)軟件故障無(wú)法被容錯(cuò)技術(shù)處理時(shí),軟件在運(yùn)行過(guò)程中喪失全部或部分功能、偏離預(yù)期的正常狀態(tài)。
由上述分析知,軟件失效是軟件缺陷發(fā)展的最終階段,也是影響軟件質(zhì)量的關(guān)鍵性因素。因此,三者間遵循缺陷→故障→失效的關(guān)系。軟件缺陷與軟件故障、軟件、失效的區(qū)別在于:軟件缺陷是軟件固有的靜態(tài)屬性,而軟件故障、軟件失效是軟件的動(dòng)態(tài)屬性;軟件缺陷是軟件故障、軟件失效的根本原因。軟件失效標(biāo)志著軟件一次使用壽命的結(jié)束。失效過(guò)的軟件通常仍然是可用的。只有當(dāng)軟件頻繁失效或公認(rèn)已經(jīng)“陳舊”時(shí),軟件才被廢棄,這一點(diǎn)需要加以說(shuō)明。進(jìn)一步給出軟件缺陷生命周期,如圖2.1所示。由圖2.1可見(jiàn),軟件缺陷生命周期分為軟件缺陷引入、軟件缺陷傳播、軟件缺陷激發(fā)和軟件缺陷定位及修改四部分。

圖2.1 軟件缺陷生命周期
(1)軟件缺陷引入:由人的錯(cuò)誤(以下“錯(cuò)誤”均指由人為失誤所導(dǎo)致的錯(cuò)誤)導(dǎo)致軟件產(chǎn)品中存在缺陷的過(guò)程稱為軟件缺陷引入,導(dǎo)致軟件缺陷引入的原因很多。由Ram Chillarege等學(xué)者提出的正交缺陷分類(Orthogonal Defect Classification,ODC)中就包含軟件缺陷引入,即“缺陷起源”(Source)屬性。由于軟件缺陷引入是軟件缺陷生命周期的起始階段,對(duì)該階段的預(yù)防性研究也成為軟件缺陷學(xué)領(lǐng)域的熱點(diǎn)問(wèn)題,并取得了一定的成果。Eitan Farchi等學(xué)者針對(duì)多線程軟件結(jié)構(gòu)的特點(diǎn)指出,使用統(tǒng)一建模語(yǔ)言(Unified Modeling Language,UML)可以在很大程度上避免多種并行軟件缺陷的引入。W.Eric Wong等學(xué)者將程序切片技術(shù)引入規(guī)范說(shuō)明與描述語(yǔ)言(Specification and Description Language,SDL),用于預(yù)防軟件架構(gòu)設(shè)計(jì)階段的缺陷引入。
(2)軟件缺陷傳播:軟件開(kāi)發(fā)前期引入的缺陷導(dǎo)致軟件開(kāi)發(fā)后期引入相關(guān)缺陷的過(guò)程稱為軟件缺陷傳播。例如,軟件需求分析階段引入的缺陷可能導(dǎo)致軟件概要設(shè)計(jì)、軟件詳細(xì)設(shè)計(jì)、軟件編碼階段引入相關(guān)缺陷。因此,在軟件開(kāi)發(fā)后期定位、修改軟件缺陷的成本比在軟件開(kāi)發(fā)前期定位、修改軟件缺陷的成本要高得多。
(3)軟件缺陷激發(fā):將靜態(tài)的軟件缺陷觸發(fā)為動(dòng)態(tài)的軟件故障或失效的過(guò)程稱為軟件缺陷激發(fā)。軟件缺陷激發(fā)的方式主要有兩種:第一種是在軟件版本固化并投入使用之后,軟件發(fā)生故障或失效的激發(fā)方式;第二種是在軟件測(cè)試過(guò)程中,通過(guò)運(yùn)行軟件(包括人腦運(yùn)行軟件的審查過(guò)程和系統(tǒng)運(yùn)行軟件的測(cè)試過(guò)程)激發(fā)軟件缺陷,導(dǎo)致預(yù)期結(jié)果與實(shí)際結(jié)果不符的方式。
(4)軟件缺陷定位及修改:針對(duì)軟件故障進(jìn)行分析,最終找到導(dǎo)致該故障的軟件缺陷的過(guò)程稱為軟件缺陷定位,對(duì)該缺陷的修正稱為軟件缺陷修改。由軟件缺陷生命周期中的傳播階段所導(dǎo)致的軟件缺陷定位一直是軟件缺陷學(xué)領(lǐng)域的難題。SD Times的主編Alan Zeichick經(jīng)調(diào)查表明:軟件缺陷定位、修改費(fèi)用的一般規(guī)律為,在軟件開(kāi)發(fā)階段花費(fèi)10美元,在軟件質(zhì)量保證階段花費(fèi)100美元,在軟件BETA版本測(cè)試階段花費(fèi)1000美元,而在軟件投入使用之后則會(huì)花費(fèi)10000美元以上。對(duì)單個(gè)軟件缺陷而言,其生命周期的最后階段就是被修改直至消除。但對(duì)軟件缺陷整體而言,測(cè)試方法的非完備性將導(dǎo)致在理論上軟件缺陷是不可能被完全定位、修改乃至消除的,只能逐漸減少。同時(shí),由于在軟件修改過(guò)程中可能會(huì)引入新的缺陷,并且隨著軟件使用范圍的不斷擴(kuò)大,有可能激發(fā)需要更長(zhǎng)時(shí)間才會(huì)導(dǎo)致失效的軟件缺陷,這導(dǎo)致對(duì)軟件缺陷整體而言,軟件缺陷殘留數(shù)最終會(huì)保持在一個(gè)常數(shù)水平上,并且缺陷激發(fā)階段和缺陷定位及修改階段是一個(gè)循環(huán)過(guò)程。
- Moodle Administration Essentials
- 數(shù)據(jù)結(jié)構(gòu)和算法基礎(chǔ)(Java語(yǔ)言實(shí)現(xiàn))
- 深入淺出Windows API程序設(shè)計(jì):編程基礎(chǔ)篇
- 深入淺出RxJS
- Learning FuelPHP for Effective PHP Development
- 微信小程序開(kāi)發(fā)與實(shí)戰(zhàn)(微課版)
- Frank Kane's Taming Big Data with Apache Spark and Python
- 從零開(kāi)始:UI圖標(biāo)設(shè)計(jì)與制作(第3版)
- BeagleBone Robotic Projects(Second Edition)
- Arduino可穿戴設(shè)備開(kāi)發(fā)
- IBM Cognos TM1 Developer's Certification guide
- NGUI for Unity
- 你真的會(huì)寫(xiě)代碼嗎
- INSTANT Apache Hive Essentials How-to
- Python編程零基礎(chǔ)入門(mén)