黃 犖 丁立冬
(上海飛機(jī)設(shè)計(jì)研究院,上海 201210)
基于LDRA Testbed的民用機(jī)載軟件結(jié)構(gòu)覆蓋率分析流程研究
黃 犖 丁立冬
(上海飛機(jī)設(shè)計(jì)研究院,上海 201210)
根據(jù)RTCA DO-178B中對(duì)于民用飛機(jī)機(jī)載軟件結(jié)構(gòu)覆蓋率的要求,從實(shí)踐出發(fā),給出了使用DLRA Testbed工具進(jìn)行民用飛機(jī)機(jī)載軟件結(jié)構(gòu)覆蓋率分析的主要流程。
機(jī)載軟件; 結(jié)構(gòu)覆蓋率;分析流程
結(jié)構(gòu)覆蓋率分析(Structural Coverage Analysis, SCA),可以揭示在基于需求的測(cè)試過(guò)程中未被執(zhí)行的代碼結(jié)構(gòu)。由于基于需求的測(cè)試,可能無(wú)法覆蓋所有的代碼結(jié)構(gòu),所以應(yīng)完成結(jié)構(gòu)覆蓋率分析,并進(jìn)行附加驗(yàn)證,以達(dá)到軟件級(jí)別所要求的結(jié)構(gòu)覆蓋率。
基于LDRA Testbed的結(jié)構(gòu)覆蓋率分析,是使用LDRA Testbed對(duì)源代碼進(jìn)行插樁,然后在真實(shí)環(huán)境中執(zhí)行插樁后的代碼和選定的基于需求的測(cè)試程序,使用LDRA Testbed對(duì)通過(guò)串口傳送到宿主機(jī)上的歷史記錄文件進(jìn)行分析,進(jìn)而產(chǎn)生結(jié)構(gòu)覆蓋率分析的報(bào)告。
本文以DO-178B《機(jī)載系統(tǒng)和設(shè)備合格審定中的軟件考慮》標(biāo)準(zhǔn)為依據(jù),描述使用LDRA Testbed,對(duì)民用飛機(jī)機(jī)載軟件進(jìn)行結(jié)構(gòu)覆蓋率分析的活動(dòng)流程。
DO-178B標(biāo)準(zhǔn)中定義軟件驗(yàn)證過(guò)程通過(guò)評(píng)審、分析活動(dòng)來(lái)驗(yàn)證需求、軟件構(gòu)架和代碼的準(zhǔn)確性、完全性和可測(cè)性;通過(guò)開(kāi)發(fā)測(cè)試用例和測(cè)試程序來(lái)驗(yàn)證需求內(nèi)部的一致性和完整性;通過(guò)運(yùn)行測(cè)試程序來(lái)驗(yàn)證代碼滿足需求的要求。
1.1 結(jié)構(gòu)覆蓋率分析的必要性
進(jìn)行結(jié)構(gòu)覆蓋率分析,是為了確定哪些代碼結(jié)構(gòu)未被測(cè)試程序執(zhí)行。測(cè)試程序可能不會(huì)完全覆蓋代碼結(jié)構(gòu),所以執(zhí)行結(jié)構(gòu)覆蓋率分析,并進(jìn)行附加驗(yàn)證,以彌補(bǔ)結(jié)構(gòu)覆蓋的不足。
結(jié)構(gòu)覆蓋率分析通過(guò)鑒定軟件模塊來(lái)完成。軟件模塊貫徹軟件需求,而這些需求則由特定的測(cè)試程序來(lái)測(cè)試。使用插樁后的代碼,再次運(yùn)行測(cè)試程序來(lái)捕獲結(jié)構(gòu)覆蓋的結(jié)果。
結(jié)構(gòu)覆蓋率分析可以揭示測(cè)試過(guò)程中未被執(zhí)行的代碼結(jié)構(gòu)。如果有疏漏,則決定是否由其它特定的測(cè)試程序來(lái)執(zhí)行被測(cè)源代碼模塊。
不同安全級(jí)別的軟件對(duì)結(jié)構(gòu)覆蓋率的要求不同。如表1所示。
表1 結(jié)構(gòu)覆蓋率要求
1.2 軟件結(jié)構(gòu)覆蓋率分析過(guò)程概述
LDRA Testbed是通過(guò)了適航認(rèn)證的覆蓋率分析工具,有很高的可靠性,使用范圍也相當(dāng)廣泛。使用LDRA Testbed進(jìn)行結(jié)構(gòu)覆蓋率分析,工作可分為3個(gè)階段。
——插裝:拷貝源代碼,在源代碼的副本中根據(jù)靜態(tài)分析得出的結(jié)果插入探針,把插裝后的文件進(jìn)行編譯、鏈接、執(zhí)行。在執(zhí)行的過(guò)程中,插入的探針記錄程序執(zhí)行的信息,并保存在歷史數(shù)據(jù)文件中。
——?jiǎng)討B(tài)覆蓋率分析:分析歷史數(shù)據(jù)文件,并在靜態(tài)信息的基礎(chǔ)上繪制動(dòng)態(tài)覆蓋率圖。
——查看報(bào)告:查看動(dòng)態(tài)覆蓋率分析的結(jié)果,選擇執(zhí)行相應(yīng)的結(jié)構(gòu)覆蓋率分析解決方案。
結(jié)構(gòu)覆蓋率分析解決方案要求進(jìn)行附加驗(yàn)證。未執(zhí)行的代碼結(jié)構(gòu)可能由下列原因造成。
——基于需求的測(cè)試用例或程序的不足。這些測(cè)試用例應(yīng)加以補(bǔ)充或修改測(cè)試程序,以提供丟失的覆蓋范圍。用于完成需求覆蓋率分析的方法可能需要加以評(píng)審。
——軟件需求的缺陷。應(yīng)修改軟件需求,開(kāi)發(fā)額外的測(cè)試用例,執(zhí)行測(cè)試程序。
——死碼。應(yīng)消除這種代碼,完成分析以評(píng)定這種影響及是否需要重新驗(yàn)證。
——非激活碼。對(duì)于在航空器或發(fā)動(dòng)機(jī)中所用的任何配置中不打算執(zhí)行的非激活碼,可以通過(guò)分析和測(cè)試來(lái)表明防止、隔離或消除無(wú)意中執(zhí)行這種碼的方法。對(duì)僅在目標(biāo)機(jī)環(huán)境的某些配置中執(zhí)行的非激活碼,要確定正常執(zhí)行這種代碼要求的操作配置,并且要開(kāi)發(fā)附加的一些測(cè)試用例和測(cè)試程序,以滿足要求的覆蓋率的目標(biāo)。
本文將要說(shuō)明的,是針對(duì)民用飛機(jī)機(jī)載軟件,使用LDRA Testbed對(duì)源代碼進(jìn)行插樁,然后在真實(shí)環(huán)境下執(zhí)行插樁后的代碼及選定的基于需求的測(cè)試程序,接著再次使用LDRA Testbed對(duì)傳送到宿主機(jī)上的歷史記錄文件進(jìn)行分析,查看分析報(bào)告選擇相應(yīng)的解決方案,進(jìn)而達(dá)到期望的軟件結(jié)構(gòu)覆蓋級(jí)別。
結(jié)構(gòu)覆蓋率分析活動(dòng),在基于需求的測(cè)試完成,源代碼及其相關(guān)的測(cè)試程序經(jīng)過(guò)評(píng)審并且進(jìn)入配置庫(kù)之后就可以開(kāi)始。
輸入數(shù)據(jù)有:待分析的源代碼、軟件需求、測(cè)試用例/程序。
結(jié)構(gòu)覆蓋率分析流程如圖1所示。
圖1 結(jié)構(gòu)覆蓋率分析流程圖
執(zhí)行結(jié)構(gòu)覆蓋率分析,包含以下活動(dòng):
——選擇要分析的代碼;
——源代碼進(jìn)行插樁;
——構(gòu)建插樁后的代碼;
——運(yùn)行插樁后的代碼;
——運(yùn)行選定的基于需求的測(cè)試用例程序;
——收集和分析歷史數(shù)據(jù)文件;
——如果發(fā)現(xiàn)代碼覆蓋率不足,選擇必要的SCA解決方案;
——重復(fù)相應(yīng)步驟直到達(dá)到期望的覆蓋級(jí)別。
4.1 基于單個(gè)文件分析
4.1.1 運(yùn)行Testbed
通過(guò)“開(kāi)始”→“所有程序”“C/C++ LDRA Testbed”來(lái)運(yùn)行Testbed。
4.1.2 選擇源文件
在File菜單下選擇Select File選項(xiàng),選擇要分析的文件。
4.1.3 設(shè)置向?qū)?duì)話框
當(dāng)新的文件或一個(gè)set被調(diào)入Testbed時(shí),向?qū)Т翱趯⒈患せ?。這個(gè)對(duì)話窗口允許測(cè)試人員修改和當(dāng)前文件相關(guān)的Sysppvar.dat文件和Sysearch.dat文件。如圖2所示。
圖2 設(shè)置向?qū)?duì)話框
4.1.4 檢查分析范圍設(shè)置
點(diǎn)擊菜單欄中的Configure,在下拉菜單中點(diǎn)擊Static Options選項(xiàng),將會(huì)出現(xiàn)圖3所示窗口。
這個(gè)窗口用來(lái)設(shè)置和靜態(tài)分析相關(guān)的選項(xiàng):
a) 是否分析include文件;
b) 通過(guò)Sysearch.dat添加搜索路徑;
c) 通過(guò)Sysppvar.dat添加宏(只針對(duì)C/ C++)。
圖3 靜態(tài)配置項(xiàng)窗口
4.1.5 選擇分析選項(xiàng)
測(cè)試人員能夠通過(guò)對(duì)話窗口來(lái)選擇Testbed進(jìn)行哪些分析。點(diǎn)擊Analysis下拉菜單,選擇Select Analysis。
測(cè)試人員通過(guò)選擇確認(rèn)框來(lái)選擇進(jìn)行哪些分析,然后選擇Start Analysis按鈕開(kāi)始進(jìn)行分析。
如果僅僅是給文件插樁,選擇Main Static Analysis和Generate Instrumented Program(s)即可。
4.1.5.1 主要靜態(tài)分析(Main Static Analysis)
Main Static Analysis是進(jìn)行其它分析的必要條件,所以在進(jìn)行其它的靜態(tài)或者動(dòng)態(tài)分析之前,一定要執(zhí)行主要靜態(tài)分析。在選擇Main Static Analysis之后,會(huì)出現(xiàn)帶下劃線的“configure”選項(xiàng),可根據(jù)需要對(duì)Main Static Analysis中的一些選項(xiàng)進(jìn)行配置。
而選擇Generate Instrumented Program(s)之后,同樣會(huì)在其后出現(xiàn)帶下劃線的“configure”選項(xiàng),可根據(jù)需要設(shè)置生成插樁后文件的名稱、指定生成插樁文件的存放路徑、選擇插樁模板等。
在編譯插樁后的文件時(shí),需要明白并不是被測(cè)系統(tǒng)的所有原文件都要被插樁。例如:一個(gè)有300個(gè)文件的系統(tǒng),測(cè)試人員可以插樁其中的一個(gè)文件,也可以把300個(gè)文件都插樁。測(cè)試人員在第一個(gè)測(cè)試覆蓋率的實(shí)例中,應(yīng)該首先測(cè)試一小部分文件而不是整個(gè)系統(tǒng)。
在這個(gè)階段,插樁后的代碼的編譯和執(zhí)行不必在Testbed中進(jìn)行。可以用插樁后的代碼代替原代碼,然后在開(kāi)發(fā)的環(huán)境中編譯,在實(shí)際的環(huán)境中運(yùn)行。同時(shí),LDRA Testbed可以很便利調(diào)用一個(gè)編譯器的命令行,或編譯命令文件。
被插樁后的文件在執(zhí)行時(shí),會(huì)打開(kāi)一個(gè)歷史文件并把分支執(zhí)行的信息寫入該文件,在執(zhí)行結(jié)束關(guān)閉該文件。在LDRA Testbed的動(dòng)態(tài)分析的選項(xiàng)中,指定執(zhí)行的歷史文件(sourcefilename.exh or history. exh)的路徑。
4.1.5.2 動(dòng)態(tài)覆蓋率分析(Dynamic Coverage Analysis)
Dynamic Coverage Analysis是對(duì)程序在運(yùn)行時(shí)生成的歷史信息,提供各種各樣的結(jié)果以及創(chuàng)建新的圖形示例和文本報(bào)告。同樣,在選擇Dynamic Coverage Analysis之后,會(huì)出現(xiàn)帶下劃線的“configure”選項(xiàng),可根據(jù)需要進(jìn)行其他相關(guān)配置。
需要說(shuō)明的是,在使用Testbed進(jìn)行動(dòng)態(tài)覆蓋率分析之前,有必要指定分析報(bào)告的級(jí)別。選擇configure下拉菜單中的Dynamic Coverage Report Options 選項(xiàng),在彈出的窗中選擇級(jí)別。
4.1.6 查看結(jié)果
分析結(jié)束后,需要查看覆蓋率結(jié)果。LDRA Testbed可以生成含有覆蓋率信息的源代碼瀏覽文件(html/txt),可在Individual Results下拉菜單中選擇所需的覆蓋率報(bào)告類型。如圖4所示。
圖4 選擇報(bào)告類型窗口
4.2 基于多個(gè)文件的分析
除了能分析單個(gè)源文件外,Testbed還能以“集”(set)的方式對(duì)多個(gè)文件同時(shí)進(jìn)行分析。一個(gè)set可以有兩種模式:Group(default)和System。
Group這種模式下,Testbed對(duì)一個(gè)set中的文件進(jìn)行相互獨(dú)立的分析,這樣對(duì)于一批文件就可以一次分析完,而不需要一個(gè)個(gè)的導(dǎo)入工具來(lái)進(jìn)行分析。
System這種模式下,Testbed將這個(gè)set中的所有文件是作為一個(gè)整體來(lái)分析的,會(huì)給出這些文件內(nèi)函數(shù)相互間的調(diào)用關(guān)系,變量引用等等結(jié)果,也就是將這些文件作為一個(gè)工程來(lái)分析。
從Set菜單,選擇Select/Create/Delete Set選項(xiàng)。
然后被提示,往如下的對(duì)話框中輸入集的相應(yīng)的名稱,如圖5所示:
集的名字不能為空白,也不應(yīng)以空格開(kāi)頭,還不可包含如下的字符:/:*?”<>|。用不被允許的字符給集命名會(huì)產(chǎn)生一個(gè)強(qiáng)制集命名的錯(cuò)誤消息。如果往LDRA Testbed中輸入有效的命名,這個(gè)名稱會(huì)被確認(rèn)并登陸到數(shù)據(jù)庫(kù)。
圖5 設(shè)置集名稱窗口
4.2.1 設(shè)置集屬性
給新集命名后會(huì)彈出如下的對(duì)話框,并要求給一個(gè)屬性。選擇“System”,然后LDRA Testbed就會(huì)把新集的名字以及其屬性保存到它的內(nèi)部的數(shù)據(jù)庫(kù)。
4.2.2 往集里添加文件
從Set菜單下選擇List/Add/Remove Files in Set,將彈出如下窗口,如圖6所示:
圖6 添加文件窗口
點(diǎn)擊Add按鈕添加要分析的程序。
4.2.3 集的分析及結(jié)果查看
對(duì)集的文件的分析和前面的單個(gè)文件的是一樣的。
不同的是集的方式在結(jié)果顯示上,System Results菜單下是一個(gè)集內(nèi)所以文件的分析結(jié)果的匯總。如果要單獨(dú)察看單個(gè)文件的結(jié)果,需要在如下的選擇框選擇想察看的文件,如圖7所示。
選定了要查看的文件后,相應(yīng)的結(jié)果查看的方式也和前面單個(gè)文件的方式一致。
V221+.91
C
1003–6660(2014)04–0026–05
10.13237/j.cnki.asq.2014.04.007
[收修訂稿日期] 2014-05-05