中國(guó)航空工業(yè)集團(tuán)公司第一飛機(jī)設(shè)計(jì)研究院 陳剛 羅旭升
民用飛機(jī)機(jī)載軟件適航對(duì)RTCA DO-178C 的使用,與DO-178B 相比提高了軟件驗(yàn)證工作中耦合覆蓋的要求。本文以DO-178C 對(duì)耦合覆蓋的要求為基礎(chǔ),分析并提出了一種能夠滿足目標(biāo)要求的控制耦合和數(shù)據(jù)耦合分析方法,同時(shí)對(duì)商用工具的選擇和工具的鑒定考慮給出了可行的建議,對(duì)我國(guó)民用飛機(jī)機(jī)載軟件符合性舉證過(guò)程具有重要的參考意義。
民用飛機(jī)機(jī)載軟件適航標(biāo)準(zhǔn)RTCA DO-178C 中對(duì)A、B、C 等級(jí)的軟件均提出了耦合覆蓋(包括數(shù)據(jù)耦合和控制耦合)的要求[1],其初衷在于評(píng)估測(cè)試的充分性。DO-178C 中對(duì)于數(shù)據(jù)耦合和控制耦合的定義如下:
數(shù)據(jù)耦合:由于軟件組件中某數(shù)據(jù)不完全受控于本組件而導(dǎo)致的對(duì)其他組件的依賴(lài)性。
控制耦合:一個(gè)軟件組件影響另一個(gè)軟件組件執(zhí)行的方式或程度。
傳統(tǒng)的軟件研制過(guò)程一直強(qiáng)調(diào)高內(nèi)聚、低耦合,其耦合也是依賴(lài)性的概念,強(qiáng)調(diào)軟件設(shè)計(jì)過(guò)程中對(duì)函數(shù)、類(lèi)或組件封裝過(guò)程中應(yīng)降低數(shù)據(jù)依賴(lài)及控制依賴(lài)。這兩個(gè)概念的相似性導(dǎo)致一部分供應(yīng)商通過(guò)軟件設(shè)計(jì)標(biāo)準(zhǔn)或編碼標(biāo)準(zhǔn)的方式提高軟件設(shè)計(jì)的內(nèi)聚性來(lái)滿足目標(biāo)要求,還有一部分供應(yīng)商會(huì)通過(guò)設(shè)計(jì)評(píng)審和代碼評(píng)審的方式來(lái)滿足目標(biāo)要求。
實(shí)際上,盡管耦合的概念類(lèi)似,但DO-178C 提出該目標(biāo)的目的并非為了降低組件間的耦合性,而是為了確認(rèn)代碼耦合關(guān)系與設(shè)計(jì)耦合關(guān)系的一致性,從而發(fā)現(xiàn):
(1)測(cè)試的不充分;
(2)代碼實(shí)現(xiàn)的多余功能。
DO-248C FAQ #67[2]雖然就該問(wèn)題進(jìn)行了解釋?zhuān)渲攸c(diǎn)在于解釋數(shù)據(jù)耦合和控制耦合的具體含義,并結(jié)合代碼邏輯進(jìn)行了說(shuō)明,卻仍然未能明確給出DO-178C 提出該目標(biāo)的意義及其與傳統(tǒng)耦合性之間的區(qū)別。本文在研究DO-178C 及相關(guān)標(biāo)準(zhǔn)的基礎(chǔ)上,進(jìn)一步闡明了耦合覆蓋分析的目的,并提出了一種能夠滿足該目標(biāo)的人工執(zhí)行方法。
DO-178C 中的耦合覆蓋目標(biāo)內(nèi)容如下:
軟件測(cè)試的結(jié)構(gòu)覆蓋率(數(shù)據(jù)耦合和控制耦合)達(dá)標(biāo)。
由目標(biāo)可知,DO-178C 中所提的數(shù)據(jù)耦合和控制耦合僅僅是結(jié)構(gòu)覆蓋率分析準(zhǔn)則的一種,同樣的結(jié)構(gòu)覆蓋率分析準(zhǔn)則還包括語(yǔ)句覆蓋、判定覆蓋和MC/DC 覆蓋,不同的準(zhǔn)則覆蓋了代碼的不同結(jié)構(gòu)。結(jié)構(gòu)覆蓋率的目的在于為測(cè)試充分性提供一定程度的度量,分析基于需求的測(cè)試是否能夠覆蓋所有的代碼結(jié)構(gòu)(語(yǔ)句、判定、條件、數(shù)據(jù)關(guān)系、調(diào)用關(guān)系等)。而數(shù)據(jù)耦合和控制耦合對(duì)應(yīng)的代碼結(jié)構(gòu)即不同軟件組件之間的數(shù)據(jù)依賴(lài)關(guān)系和控制依賴(lài)關(guān)系。
正常情況下,語(yǔ)句、DC 及MC/DC 覆蓋率都會(huì)分別在組件級(jí)別的測(cè)試中進(jìn)行收集后匯總得出分析結(jié)果。換句話說(shuō),軟件組件內(nèi)部的結(jié)構(gòu)覆蓋性可以因此得以保證,但是對(duì)軟件集成測(cè)試,也就是集成后組件和組件之間的結(jié)構(gòu)關(guān)系并未進(jìn)行覆蓋,而這也正是耦合覆蓋分析的主要目的,對(duì)不同組件之間的依賴(lài)關(guān)系進(jìn)行結(jié)構(gòu)覆蓋[3]。組件之間的依賴(lài)關(guān)系主要體現(xiàn)在以下幾個(gè)方面:
(1)軟件組件之間的調(diào)用關(guān)系;(2)通過(guò)任務(wù)調(diào)度、跳轉(zhuǎn)、中斷處理等觸發(fā)的軟件組件的執(zhí)行關(guān)系;(3)軟件組件間的參數(shù)傳遞;(4)多于一個(gè)組件使用的全局變量。在耦合覆蓋分析之后,可以驗(yàn)證軟件集成關(guān)系或依賴(lài)關(guān)系的正確性,同時(shí)證明軟件測(cè)試的充分性。耦合覆蓋分析結(jié)果與預(yù)期不符時(shí),可能有兩種情況:
1)測(cè)試不充分,需增加需求及測(cè)試用例或單獨(dú)增加測(cè)試用例對(duì)未覆蓋的耦合關(guān)系進(jìn)行覆蓋;2)代碼冗余,應(yīng)修改代碼,去掉不應(yīng)實(shí)現(xiàn)的依賴(lài)關(guān)系,若出于某種原因(如防御性編程)需要保留,應(yīng)進(jìn)行分析說(shuō)明。
完成耦合覆蓋分析,需要完成以下幾個(gè)活動(dòng):
(1)耦合分析活動(dòng)的計(jì)劃:在軟件驗(yàn)證計(jì)劃中具體說(shuō)明數(shù)據(jù)耦合分析及控制耦合分析的方法;
(2)標(biāo)準(zhǔn)約束:前文提到的在標(biāo)準(zhǔn)文件中增加設(shè)計(jì)約束的方法,雖不能單獨(dú)滿足耦合覆蓋目標(biāo),但仍然建議使用??梢源蠓档婉詈细采w分析的復(fù)雜度,可以考慮的因素包括限制全局變量的使用、限制同一變量在多處賦值的情況、限制類(lèi)型的強(qiáng)制轉(zhuǎn)換、限制直接跳轉(zhuǎn)語(yǔ)句的使用等;
(3)軟件架構(gòu)設(shè)計(jì):在軟件架構(gòu)設(shè)計(jì)時(shí),明確組件間的接口、調(diào)用關(guān)系、調(diào)度策略、中斷處理邏輯等。必要時(shí)采用控制流圖、數(shù)據(jù)流圖、時(shí)序圖等圖表方式表達(dá);
(4)軟件設(shè)計(jì)評(píng)審:在軟件設(shè)計(jì)評(píng)審時(shí),確認(rèn)軟件架構(gòu)設(shè)計(jì)的合理性和正確性;
(5)代碼耦合關(guān)系分析:提取源代碼中已經(jīng)實(shí)現(xiàn)的組件間的調(diào)用關(guān)系、變量的定義和使用關(guān)系、數(shù)據(jù)流等耦合關(guān)系,必要時(shí)可采用圖形方式表達(dá)。一般情況下,這一步采用工具進(jìn)行分析,若采用人工分析代碼的形式,需要滿足兩個(gè)條件:
1)使用第(2)步的標(biāo)準(zhǔn)約束大幅降低人工分析的復(fù)雜度。如果不加限制,對(duì)于多處寫(xiě)一處讀和多處寫(xiě)多處讀的情況,當(dāng)讀寫(xiě)次序發(fā)生變化時(shí),可能造成極其復(fù)雜的情況,人工分析無(wú)法保證覆蓋所有可能的情況;2)源代碼量在可接受范圍以?xún)?nèi)。一般情況下,使用這一步驟分析得出的軟件間的耦合關(guān)系可以向軟件架構(gòu)設(shè)計(jì)過(guò)程反饋,對(duì)于某兩個(gè)組件間關(guān)系過(guò)于復(fù)雜的情況,可以考慮將這兩個(gè)組件進(jìn)行合并處理(可以使用工具的自動(dòng)優(yōu)化功能,優(yōu)化出來(lái)的軟件架構(gòu)可能從設(shè)計(jì)方面并不符合人工的設(shè)計(jì)習(xí)慣,但耦合關(guān)系能夠大為簡(jiǎn)化,可以參考執(zhí)行)。對(duì)軟件架構(gòu)關(guān)系進(jìn)行優(yōu)化后,應(yīng)從第(3)步重新開(kāi)始執(zhí)行;
(6)耦合覆蓋對(duì)比分析:在動(dòng)態(tài)測(cè)試中使用插樁或使用工具統(tǒng)計(jì)耦合關(guān)系的覆蓋情況。將耦合覆蓋結(jié)果與預(yù)期結(jié)果(即第(3)步在設(shè)計(jì)階段明確的耦合關(guān)系)進(jìn)行對(duì)比分析,主要關(guān)注以下方面[4]:
1)數(shù)據(jù)類(lèi)型的一致性,即是否存在類(lèi)型的隱式轉(zhuǎn)換,并分析其帶來(lái)的影響;2)數(shù)據(jù)含義的一致性,保證不同組件對(duì)同一個(gè)變量的含義有相同的理解和使用,好的變量名稱(chēng)定義可以降低此類(lèi)錯(cuò)誤發(fā)生概率;3)確認(rèn)數(shù)據(jù)依賴(lài)的類(lèi)型(如圖1所示四種類(lèi)型,指向Data 的表示數(shù)據(jù)的寫(xiě)入方,Data 指向的為數(shù)據(jù)的讀取方),保證組件之間的數(shù)據(jù)寫(xiě)入和讀取順序與設(shè)計(jì)相一致,存在多方讀操作或多方寫(xiě)操作時(shí),操作順序與設(shè)計(jì)結(jié)果一致;4)組件間調(diào)用關(guān)系、執(zhí)行次序與設(shè)計(jì)一致;5)組件之間的通訊時(shí)效性檢查(同步/異步,可能包含向寄存器或數(shù)據(jù)緩沖區(qū)的寫(xiě)入和讀取操作)。
圖1 四種數(shù)據(jù)依賴(lài)類(lèi)型Fig.1 Four data dependency types
需要注意的是,在使用基于需求的測(cè)試對(duì)組件間的依賴(lài)關(guān)系進(jìn)行覆蓋時(shí),也應(yīng)同時(shí)考慮需求正常范圍和異常范圍的測(cè)試。另外,數(shù)據(jù)耦合覆蓋分析和控制耦合覆蓋分析是兩個(gè)獨(dú)立的驗(yàn)證方法,美國(guó)FAA 的立場(chǎng)文件CAST-19 中認(rèn)為應(yīng)該生成兩個(gè)獨(dú)立的報(bào)告。以DO-178C 的一貫作風(fēng),其實(shí)一個(gè)完整報(bào)告還是分開(kāi)為兩個(gè)報(bào)告并不重要,重要的是認(rèn)識(shí)到這兩個(gè)驗(yàn)證活動(dòng)的獨(dú)立性,即使生成同一報(bào)告也應(yīng)該分章節(jié)對(duì)不同的覆蓋準(zhǔn)則進(jìn)行描述和匯總。
除上文所述方法外,由于軟件結(jié)構(gòu)復(fù)雜度的影響,很多情況下即使對(duì)軟件架構(gòu)進(jìn)行了優(yōu)化,仍然會(huì)有很高的耦合分析復(fù)雜度,此時(shí)最好的方法就是使用成熟商用工具,這也是國(guó)內(nèi)外大部分民用飛機(jī)設(shè)備供應(yīng)商的選擇。在商用工具的選擇方面,建議考慮以下幾點(diǎn):
(1)組件定義的靈活程度:不同項(xiàng)目對(duì)組件的劃分方法不同,有的項(xiàng)目以文件為基本單元?jiǎng)澐植煌M件分別包含哪些文件,有些項(xiàng)目則喜歡以函數(shù)為基本單元?jiǎng)澐纸M件。由于使用工具之前需要指定不同組件所包含的內(nèi)容(如包含哪些文件或包含哪些函數(shù)),因此更靈活的組件定義方法可以適用于更多的機(jī)載軟件研制項(xiàng)目;
(2)是否能用于架構(gòu)優(yōu)化:耦合分析工具能夠根據(jù)軟件源代碼以及用戶(hù)對(duì)組件的定義分析得出現(xiàn)有的軟件組件間耦合關(guān)系。部分工具還帶有架構(gòu)自動(dòng)優(yōu)化功能,可以指導(dǎo)用戶(hù)進(jìn)一步優(yōu)化軟件架構(gòu),簡(jiǎn)化組件間的耦合關(guān)系;
(3)耦合關(guān)系識(shí)別的全面程度:耦合分析工具是否考慮了本文第2 節(jié)提出的所有可能關(guān)系,如分析不全面,仍需人工分析進(jìn)行補(bǔ)充;
(4)插樁代碼量:插樁的代碼量關(guān)系到對(duì)源代碼結(jié)構(gòu)的影響,如果插樁的代碼量較大,意味著插樁后代碼與原軟件產(chǎn)品的差異越大,局方給與的置信度也會(huì)越低。因此在選擇工具時(shí),必須考慮插樁代碼對(duì)源代碼結(jié)構(gòu)的影響問(wèn)題;
(5)耦合報(bào)告內(nèi)容詳細(xì)程度:為支持耦合覆蓋分析結(jié)果(如覆蓋率百分比),對(duì)已覆蓋的耦合關(guān)系應(yīng)給出耦合關(guān)系類(lèi)型(如讀寫(xiě)耦合、調(diào)用耦合等)、對(duì)應(yīng)代碼位置、覆蓋該關(guān)系的測(cè)試用例等信息,對(duì)于未被覆蓋的耦合關(guān)系也應(yīng)至少給出耦合關(guān)系類(lèi)型和對(duì)應(yīng)的代碼位置,以便于分析該段代碼對(duì)應(yīng)的需求完整程度或測(cè)試用例完整程度。
對(duì)于工具鑒定,RTCA DO-178C 中明確,如果滿足以下兩個(gè)條件,則需要對(duì)工具進(jìn)行鑒定:
(1)由于工具的使用,造成了某個(gè)過(guò)程的自動(dòng)執(zhí)行、減少執(zhí)行或不執(zhí)行;(2)不會(huì)對(duì)工具的輸出進(jìn)行驗(yàn)證。
以耦合覆蓋分析工具為例來(lái)說(shuō),該工具的使用是為了替代人工,也就是用于自動(dòng)執(zhí)行分析過(guò)程的。因此,如果我們信任工具的結(jié)果,不對(duì)結(jié)果進(jìn)行再次核對(duì)和檢查,則該工具需要執(zhí)行工具鑒定。反過(guò)來(lái)說(shuō),如果該工具未進(jìn)行鑒定,且不打算隨機(jī)取證,則需要工具提供足夠的中間數(shù)據(jù),用以支撐用戶(hù)對(duì)其結(jié)果進(jìn)行核對(duì)和分析,從而人工確定其分析結(jié)果的正確性。
軟件的數(shù)據(jù)耦合覆蓋分析和控制耦合分析是結(jié)構(gòu)覆蓋率分析的一種,是DO-178C 對(duì)A、B、C 級(jí)軟件的強(qiáng)制要求。隨著國(guó)內(nèi)民機(jī)事業(yè)的不斷發(fā)展,搞清楚DO-178C 提出耦合覆蓋分析的目的,并知道如何去實(shí)施是勢(shì)在必行的事情。本文在研究DO-178C、CAST Paper 及相關(guān)報(bào)告的基礎(chǔ)上,提出了一種從計(jì)劃階段一直到驗(yàn)證階段的符合性方法,并給出了耦合覆蓋分析的若干分析要點(diǎn),同時(shí)對(duì)工具的選擇及鑒定考慮也給出了相關(guān)建議,對(duì)我國(guó)民用飛機(jī)機(jī)載軟件的耦合覆蓋分析舉證過(guò)程具有相當(dāng)?shù)闹笇?dǎo)意義。
數(shù)字技術(shù)與應(yīng)用2022年11期