如何獲得安全關(guān)鍵系統(tǒng)的100%結(jié)構(gòu)代碼覆蓋率?
許多軟件開(kāi)發(fā)和驗(yàn)證工程師并不真正理解為什么獲得結(jié)構(gòu)覆蓋很重要。許多人這樣做只是因?yàn)檫@是他們行業(yè)的功能標(biāo)準(zhǔn)所要求的,而不是認(rèn)真對(duì)待。
像ADAS這樣的安全關(guān)鍵系統(tǒng)可以在沒(méi)有司機(jī)的情況下運(yùn)送乘客,使自動(dòng)駕駛儀能夠讓人們?cè)谖覀兊奶炜罩酗w行,并通過(guò)醫(yī)療設(shè)備讓病人活著。人們的生活依賴于這些系統(tǒng)。獲得結(jié)構(gòu)代碼覆蓋率至關(guān)重要。讓我們來(lái)看看什么是結(jié)構(gòu)性覆蓋,以及它為什么重要的更多原因。
什么是結(jié)構(gòu)覆蓋?
簡(jiǎn)而言之,結(jié)構(gòu)覆蓋是為了確定系統(tǒng)是否經(jīng)過(guò)充分測(cè)試而執(zhí)行和記錄的代碼的標(biāo)識(shí)。安全關(guān)鍵系統(tǒng)覆蓋的徹底性取決于安全完整性等級(jí)(SIL)、汽車工業(yè)中的ASIL和航空電子設(shè)備中常用的開(kāi)發(fā)保證等級(jí)(DAL)。
在嵌入式系統(tǒng)中,這些通常被分解到代碼語(yǔ)句、分支、修改的條件決定,你還可以鉆研到更細(xì)的粒度,比如對(duì)象代碼或匯編語(yǔ)言。
你可能會(huì)聽(tīng)到或讀到其他類型的覆蓋指標(biāo),比如函數(shù)、調(diào)用、循環(huán)、條件、跳轉(zhuǎn)、決策等。但對(duì)于嵌入式安全關(guān)鍵型系統(tǒng)來(lái)說(shuō),你目前需要了解的是語(yǔ)句、分支、MC/DC和對(duì)象代碼。
目前有一種趨勢(shì)是采用多條件覆蓋(MCC),它比MC/DC更徹底。MCC要求的測(cè)試用例數(shù)量要多得多-2,達(dá)到條件數(shù)的冪。其計(jì)算公式為 2C
報(bào)表和分支機(jī)構(gòu)覆蓋率
語(yǔ)句覆蓋是最簡(jiǎn)單的工作,代表了程序中的每一行代碼。然而,代碼語(yǔ)句可以有不同程度的復(fù)雜性。例如,分支語(yǔ)句表示代碼中的if then else條件。case或switch等語(yǔ)句被解釋為分支。不過(guò),如果你要獲得分支的覆蓋率,這意味著必須覆蓋真和假?zèng)Q策路徑的執(zhí)行。
在關(guān)注更高的安全水平時(shí),可能需要修改后的條件決定覆蓋范圍(MC/DC)。分支的復(fù)雜程度會(huì)越來(lái)越高,在一個(gè)決策中存在多個(gè)條件,而且每個(gè)條件都必須獨(dú)立測(cè)試。
語(yǔ)句覆蓋是最簡(jiǎn)單的工作,代表了程序中的每一行代碼。然而,代碼語(yǔ)句可以有不同程度的復(fù)雜性。例如,分支語(yǔ)句表示代碼中的if then else條件。case或switch等語(yǔ)句被解釋為分支。不過(guò),如果你要獲得分支的覆蓋率,這意味著必須覆蓋真和假?zèng)Q策路徑的執(zhí)行。
對(duì)于覆蓋標(biāo)準(zhǔn)來(lái)說(shuō),這意味著決策中的每個(gè)條件都已被證明會(huì)獨(dú)立影響該決策的結(jié)果。
同時(shí),程序中的每一個(gè)決策中的條件都至少采取了一次所有可能的結(jié)果,程序中的每一個(gè)決策都至少采取了一次所有可能的結(jié)果。在下面有4個(gè)條件語(yǔ)句的例子中,有16個(gè)可能的測(cè)試用例。MC/DC在這個(gè)例子中只需要5個(gè)。取條件數(shù)加1。
對(duì)象代碼覆蓋率
對(duì)于最嚴(yán)格的安全關(guān)鍵型應(yīng)用,如航空電子,工藝標(biāo)準(zhǔn)DO-178B/C Level A規(guī)定了對(duì)象代碼覆蓋。這是由于編譯器或鏈接器會(huì)產(chǎn)生額外的代碼,這些代碼不能直接追溯到源代碼語(yǔ)句。因此,必須進(jìn)行匯編級(jí)覆蓋。
想象一下,必須執(zhí)行這項(xiàng)任務(wù)的嚴(yán)謹(jǐn)性和人力成本。幸運(yùn)的是,有Parasoft ASMTools,一個(gè)關(guān)于獲得對(duì)象代碼覆蓋的自動(dòng)化解決方案。
獲得代碼覆蓋范圍
代碼覆蓋率往往是通過(guò)對(duì)代碼進(jìn)行檢測(cè)來(lái)確定的。檢測(cè)指的是在用戶代碼中加入額外的代碼,以便在執(zhí)行過(guò)程中確定該語(yǔ)句、分支或MC/CD是否被執(zhí)行。
基于嵌入式目標(biāo)或設(shè)備,覆蓋數(shù)據(jù)可以存儲(chǔ)在文件系統(tǒng)中,寫入內(nèi)存,或通過(guò)各種通信渠道,如串行端口、TCP/IP端口、USB甚至JTAG發(fā)送出去。
獲得嵌入式安全和安全關(guān)鍵型系統(tǒng)的代碼覆蓋率
對(duì)于代碼覆蓋率的要求,比如規(guī)定的100%的結(jié)構(gòu)、分支和MC/DC覆蓋率,或者是可選的、個(gè)人想要的80%,有幾種測(cè)試方法用來(lái)滿足你的目標(biāo)。最常見(jiàn)的方法。
- 系統(tǒng)測(cè)試
- 單元測(cè)試
- 手動(dòng)測(cè)試
綜合這些不同做法的覆蓋率指標(biāo)是典型的。但代碼覆蓋率究竟如何確定呢?
系統(tǒng)測(cè)試的覆蓋范圍
通過(guò)系統(tǒng)測(cè)試獲得代碼覆蓋率是一個(gè)很好的方法,可以確定是否已經(jīng)進(jìn)行了足夠的測(cè)試。方法是運(yùn)行所有的系統(tǒng)測(cè)試,然后檢查代碼中哪些部分沒(méi)有被行使。
未執(zhí)行的代碼意味著可能需要新的測(cè)試用例來(lái)行使未被觸及的代碼,在這些代碼中可能潛伏著缺陷,并有助于回答這樣一個(gè)問(wèn)題:我是否做了足夠的測(cè)試?
當(dāng)我在系統(tǒng)測(cè)試期間進(jìn)行過(guò)代碼覆蓋率的測(cè)試時(shí),平均得出的指標(biāo)是60%的覆蓋率。40%的未執(zhí)行代碼中的大部分是由于你的應(yīng)用程序中的防御性代碼。
還有你的編碼準(zhǔn)則規(guī)定的防御性代碼,系統(tǒng)測(cè)試永遠(yuǎn)無(wú)法執(zhí)行。由于這些原因,系統(tǒng)測(cè)試不能帶你達(dá)到100%的結(jié)構(gòu)代碼覆蓋率。你需要采用其他的測(cè)試方法,如手動(dòng)和/或單元測(cè)試來(lái)讓你達(dá)到100%。要知道,流程標(biāo)準(zhǔn)允許合并從各種測(cè)試方法獲得的覆蓋率指標(biāo)。
單元測(cè)試的覆蓋范圍
如前所述,單元測(cè)試可以作為系統(tǒng)測(cè)試的補(bǔ)充方法,以獲得100%的覆蓋率。通過(guò)單元測(cè)試獲得代碼覆蓋率是比較流行的方法之一,但它并不能暴露你是否對(duì)系統(tǒng)做了足夠的測(cè)試,因?yàn)橹攸c(diǎn)是在單元級(jí)(函數(shù)/程序)。
這里的目標(biāo)是創(chuàng)建一組單元測(cè)試用例,在所需的覆蓋率合規(guī)性需求(語(yǔ)句、分支和MC/DC)下行使整個(gè)單元,以達(dá)到該單個(gè)單元100%的覆蓋率。每一個(gè)單元都要重復(fù)這樣做,直到覆蓋整個(gè)代碼庫(kù)。然而,要想從單元測(cè)試中獲得最大的收益,不要只關(guān)注獲得代碼覆蓋率。
為了幫助通過(guò)單元測(cè)試加快代碼覆蓋率,Parasoft C/C++test中存在可配置的自動(dòng)測(cè)試用例生成功能。測(cè)試用例可以自動(dòng)生成,以測(cè)試空指針、最小-中間-最大范圍、邊界值等的使用。這種自動(dòng)化可以讓你走得更遠(yuǎn)。在幾分鐘內(nèi),你將獲得大量的代碼覆蓋率。
然而,與系統(tǒng)測(cè)試一樣,由于使用防御性代碼或形式化語(yǔ)言語(yǔ)義,獲得100%的代碼覆蓋率是難以實(shí)現(xiàn)的。在單元的顆粒級(jí)別上,防御性代碼可能以開(kāi)關(guān)中的默認(rèn)語(yǔ)句的形式出現(xiàn)。如果一個(gè)開(kāi)關(guān)中的每一個(gè)可能的情況都被捕獲,這就使得缺省語(yǔ)句無(wú)法到達(dá)。
那么,對(duì)于這些特殊情況,如何才能獲得100%的保障呢?
答案是需要部署手動(dòng)方法。用戶可以通過(guò)使用調(diào)試器,修改調(diào)用棧,執(zhí)行return 0;語(yǔ)句,將該語(yǔ)句標(biāo)注或標(biāo)注為覆蓋。目視見(jiàn)證執(zhí)行過(guò)程,至少要記錄現(xiàn)在被認(rèn)為是覆蓋的文件名、代碼行和代碼語(yǔ)句。
這種通過(guò)手動(dòng)/視覺(jué)檢查和報(bào)告執(zhí)行的覆蓋可以用來(lái)補(bǔ)充通過(guò)單元測(cè)試捕獲的覆蓋。這兩種覆蓋報(bào)告的補(bǔ)充可以用來(lái)證明100%的結(jié)構(gòu)代碼覆蓋。
如果系統(tǒng)測(cè)試覆蓋發(fā)生了,并且要包括在內(nèi),則可以使用所有三個(gè)覆蓋報(bào)告(系統(tǒng)、單元、手動(dòng))來(lái)顯示和證明100%的覆蓋率和合規(guī)性。
當(dāng)標(biāo)準(zhǔn)基于您的SIL、ASIL或DAL級(jí)別時(shí),可能需要執(zhí)行不同級(jí)別的覆蓋(聲明、分支、MC/DC和目標(biāo)代碼)。幸運(yùn)的是,Parasoft提供了自動(dòng)化的軟件測(cè)試解決方案,以及您在獲得100%結(jié)構(gòu)代碼覆蓋率時(shí)需要解決的方法。
了解如何為您的嵌入式項(xiàng)目利用代碼分析技術(shù)。請(qǐng)點(diǎn)擊下方圖片觀看視頻。