馬云云 張 弛 王金波 瞿躍龍
中國科學院空間應用工程與技術中心,北京100094
嵌入式航天軟件匯編代碼覆蓋測試方案*
馬云云 張 弛 王金波 瞿躍龍
中國科學院空間應用工程與技術中心,北京100094
從插樁策略、覆蓋率收集方法2個方面設計實現了一種匯編代碼覆蓋測試方案,解決了嵌入式航天軟件匯編代碼覆蓋測試沒有工具支持的問題。針對嵌入式系統資源緊張、時序相關性強的特點,在研究匯編語言指令結構的基礎上,制定了一套基于比特位表征方式的匯編插樁策略;提出了一種基于JTAG接口的通用覆蓋率數據收集方案,解決了覆蓋信息輸出通道受限問題。實驗結果及工程應用實例證明了方案的有效性和可行性。
覆蓋測試;軟件測試;嵌入式軟件;代碼插裝
覆蓋測試是軟件白盒測試的主要方法,覆蓋測試不僅能發現被測程序的邏輯結構異常等缺陷信息,更是檢驗軟件測試充分性,保證測試質量的有效方法之一。在高可靠軟件應用領域,DO-178B和EN50128 等安全性標準對軟件測試的覆蓋率進行了詳細的要求;在國內航空航天、軌道交通等高可靠領域,對軟件代碼覆蓋率也有明確要求,通常至少應達到代碼語句、分支100%覆蓋的要求。
嵌入式航天軟件中,匯編與C語言混合編程的方式較為普遍,但目前大多數覆蓋率測試工具針對的是C/C++等高級語言,針對匯編語言的工具相當少見[1],因而在實際評測過程中,經常導致沒有商業測試工具支持而無法對匯編代碼進行覆蓋測試。因此,設計一套通用的匯編代碼覆蓋測試方案,解決現有測試平臺對匯編覆蓋測試支撐不足的問題,已成為當前航天軟件評測亟需解決的問題。
本文在研究匯編語言指令結構的基礎上,結合嵌入式航天軟件特點,設計實現了一種嵌入式匯編軟件覆蓋測試方案。
匯編語言是一種結構化較弱的程序設計語言,可能出現多入口和多出口的情況,這些特點決定了對其進行覆蓋測試相當困難。雖然在我國航天型號嵌入式軟件覆蓋測試方面取得了一定的成績[2],但對于匯編代碼覆蓋測試仍常出現沒有商業工具支持,導致測試工作充分性沒有客觀評價和必要質量保證的情況。
目前,商業覆蓋率收集測試平臺主要有Testbed, Logiscope,CodeTest,Cantata,CuttleITE,BullseyeCoverage,PureCoverage和GCOV等,上述測試平臺支持對象主要集中在C/C++語言代碼編程的軟件系統。而對于匯編代碼,由于其與硬件具有極高的耦合度,不同的嵌入式平臺匯編指令集各不相同等原因,工具可支持的匯編指令集非常稀少。
針對匯編代碼覆蓋測試少有工具支持的現狀,文獻[3]提出一種基于主機的嵌入式匯編插樁技術,以序列塊為基本插樁單元,一定程度上降低了代碼的膨脹率;文獻[4]基于Intel8051指令系統,設計實現了一種虛擬插樁方案,利用仿真器斷點機制拋出程序樁點信息,解決某些嵌入式軟件中不易進行程序插樁的問題,這一方案主要適用于實時性要求不高的被測系統,對于實時性要求苛刻的高可靠控制領域,如航空、航天領域控制軟件,由于斷點處理過程耗時長,易破壞被測系統接口時序關系,導致功能行為失真,甚至無法進入預期功能分支。文獻[5]提出了一種利用Gcov工具進行匯編覆蓋測試的方案,并在X86平臺進行了原型驗證,這一方案的適用場景并未考慮嵌入式系統平臺資源緊張(內存不豐富、可用IO通道少)、時序相關性強的特點[6],且對于沒有文件系統的嵌入式系統生成覆蓋數據文件是非常困難。
在實時性要求高的嵌入式航天軟件領域,需要一個資源、時序開銷小且相對通用的匯編代碼覆蓋測試方案,解決嵌入式匯編軟件難于插樁、覆蓋率數據輸出通道受限等問題。
在研究匯編語言指令結構的基礎上,針對嵌入式平臺資源緊張、時序相關性強的特點,從插樁策略和覆蓋率收集方法兩方面設計實現了一套匯編覆蓋測試方案,具體實施框架如圖1所示。

圖1 嵌入式匯編代碼覆蓋測試框架
在上位機中,采用基于比特位表征方式的匯編插樁策略完成代碼插樁;在被測系統上運行插樁后的代碼,并對產生的樁點數據進行暫存;利用硬件仿真器JTAG接口建立集成開發環境與目標CPU之間的硬件實時通信通道,進行覆蓋率信息收集,在集成開發環境中接收查看覆蓋率信息,進行覆蓋分析。
2.1 程序插樁策略
程序插樁是實現覆蓋測試的關鍵技術之一,目前大多數覆蓋測試工具均采用代碼插樁技術。傳統的插樁策略是在所有需要插樁的位置插入探針,在程序運行過程中收集所有可能用到的程序信息,但這種策略插樁開銷過大,無法滿足嵌入式系統覆蓋測試需要。針對上述問題,許多研究學者提出了一些插樁策略及改進方法來降低插樁開銷[7-10],但這些方法的研究對象主要針對高級語言代碼,并未考慮嵌入式匯編代碼的特殊性。
針對匯編程序語句、分支覆蓋測試實際情況,本文從樁點信息表征方式、樁點插入規則和樁點輸出函數實現3個方面對插樁策略進行具體介紹。
2.1.1 樁點信息表征方式
對于樁點數據采用按比特位表征的方式,使得樁點數據在存儲空間、數據輸出時間方面開銷盡可能小,以適應嵌入式系統存儲資源匱乏、時序緊張的特點。
具體的,每個樁點以{樁點ID、樁點狀態}方式唯一表征,其中:
樁點ID:代表被覆蓋語句分支在代碼中的具體位置。樁點ID編號時,考慮到匯編程序中往往采用很多條件和無條件跳轉指令,結構復雜,若按照執行順行對樁點ID進行編號,易出現插樁遺漏情況。本文以源代碼行號前后次序進行編號,假設源代碼共需插樁n個,則樁點ID按照0,1,2,…,n-1進行編號。對于收集語句覆蓋率的情況,同一源文件中樁點直接按照源代碼先后順序進行編號;對于需要收集分支的情況,按照真分支樁點編號為X,假分支編號為X+1的規則進行編號。
樁點狀態:代表樁點的覆蓋情況,采用基于比特位方式表征,0代表未覆蓋,1代表已覆蓋。每個樁點在內存空間中僅占用1比特,對于同一樁點信息多次被執行的情況,不會額外增加存儲空間,均可通過對應比特位取值表征該樁點是否在測試過程中運行到。采用這種設計思路,可以大大降低覆蓋率信息對存儲空間的占用以及樁點數據傳輸對接口時序造成的不良影響。例如,對于語句分支樁點個數為200的匯編代碼,僅需要25個字節即可存儲全部樁點的覆蓋信息。
2.1.2 樁點插入規則
通過分析匯編代碼結構特征,應在以下幾個特征位置進行插裝:條件判斷語句、直接跳轉語句、條件跳轉、宏定義和標號內代碼。
在樁點插入過程中,以源代碼行號前后次序在上述位置按照具體插樁策略進行,保證在順序執行的語句塊的第一條語句前和最后一條語句前均進行插樁,且每一個條件判斷的真假分支均有唯一樁點信息對應。具體樁點插入過程可利用程序自動完成,對于代碼量少的情況也可手動插入,具體方式可視實際情況而定。下面具體介紹插樁規則。
1)條件判斷語句
對于條件判斷語句,應在該語句之前對條件真假分支分別插入樁點,見表1。

表1 條件判斷語句插樁
表1中,樁點(x)反映該條件判斷的TRUE分支覆蓋情況;樁點(x+1)反映該條件判斷的FALSE分支覆蓋情況。
此外,由于樁點(x)及(x+1)插入位置也是條件判斷語句之前的上一程序基本塊的結束位置,因此樁點(x)及(x+1)也同時反映了上一程序基本塊的覆蓋情況。
2)無條件轉移指令
無條件轉移指令包含直接跳轉語句、子程序調用指令等,對于這類指令應在無條件轉移指令前、后分別設置樁點。

表2 無條件轉移指令插樁
表2中,樁點(x)反映轉移語句之前順序執行的代碼段的語句覆蓋情況,樁點(x+1)反映插入點后的下一個順序執行的代碼段的語句覆蓋情況。
3)條件轉移指令
條件轉移語句應在條件跳轉前后分別設置反映條件判斷真、假分支覆蓋情況的樁點,插樁方式如表3。

表3 條件轉移指令插樁
表3中,樁點(x)反映該條件判斷的TRUE分支覆蓋及上一樁點至條件判斷之間語句覆蓋情況;樁點(x+1)反映該條件判斷的FALSE分支以及后續語句的覆蓋情況。
4)宏定義
宏定義代碼,需要在宏定義代碼開始處、結束處插樁,內部語句插樁方式與外部匯編代碼插樁方式類似。
5)標號
由于標號內代碼可能是順序執行地址或跳轉后執行地址,也可能是子程序入口地址或宏調用入口。因此對于標號內代碼需在標號內代碼執行開始位置、結束位置設置樁點。對于標號是子程序入口地址的情況,結束位置為子程序返回指令前;標號不是子程序入口地址的情況,結束位置為下一個標號開始前。標號內代碼與基本匯編代碼插樁方式類似,需在條件判斷處、跳轉處設置樁點。
2.1.3 樁點輸出函數實現
嵌入式航天軟件的匯編代碼具有體量小但安全關鍵程度較高的特點。因此,樁點數量與高級語言編寫的代碼相比非常少,樁點覆蓋信息采用按比特位方式表示后,樁點覆蓋信息所需占用存儲空間則更少。
鑒于以上特點,在樁點輸出函數設計時,將樁點覆蓋數據輸出至被測系統內部空閑存儲空間存儲,當接收到覆蓋數據回傳控制命令時,才將覆蓋數據輸出至系統外。此外,還應盡可能降低樁點輸出對被測軟件時間特性、時序關系的影響。樁點輸出函數實現流程分為如下5步:
Step1:為樁點信息分配內存空間,并初始化為未覆蓋狀態;
Step2:寄存器壓棧處理;
Step3:根據樁點編號計算樁點存儲位置;
Step4:將存儲位置對應的比特位置為已覆蓋狀態;
Step5:寄存器出棧處理。
以TMS320C6000系列DSP運行平臺為例,給出插樁函數實現示例如下:
OUT_PUT .macro ID;也可定義為子程序
……;寄存器壓棧處理
mvkl OUTPUT_ADDR,a7
mvkh OUTPUT_ADDR,a7
mv ID,a3
nop 5
shr a3, 0x03, b0
clr a3,3,15, a2
add a7, b0, a7
nop 5
mvk 0x01,a8
shl a8, a2, a8
ldb *a7,b8
nop 5
or b8,a8,b8
stb b8,*a7
nop 5
……;寄存器出棧處理
.endm
其中,OUTPUT_ADDR為事先定義的覆蓋率數據信息存儲起始地址,ID號為樁點ID。
2.2 覆蓋率信息收集
目前,嵌入式系統覆蓋率數據收集過程中常遇到以下難題:1)被測系統上既有接口類型受限;2)覆蓋率數據接收設備的接收處理能力不足。實時嵌入式軟件樁點輸出量大,若采用低速通信方式,常無法滿足時序要求,導致系統功能行為失真;若采用高速接口,則需要專用高速覆蓋率接收設備。
為了擺脫對覆蓋率數據專用接收設備的依賴,并克服被測系統常無可用輸出通道的問題,需要采用一種相對通用的覆蓋率數據輸出方式,并減輕高速、大數據量樁點傳輸對被測系統功能行為的影響。通過對主流嵌入式系統平臺調研,目前多數高級器件都支持JTAG協議,如DSP,FPGA,ARM和部分單片機器件等, 并且JTAG在測試信號完整性和嵌入式在線仿真方面都有很好的應用。
本文利用嵌入式在線仿真器與被測目標板JTAG口連接,建立集成開發環境與目標CPU的硬件實時通信通道,將被測系統動態運行過程中產生的樁點數據通過JTAG接口輸出至系統外部,由集成開發環境所在上位機接收。
下面以TI公司的DSP處理器為例,給出具體的覆蓋率數據收集方案,見圖2。

圖2 覆蓋率數據收集方案
被測代碼插樁后,下載至嵌入式平臺運行;產生的樁點數據直接存儲在被測系統內部;在CCS(Code Composer Studio)集成開發環境中進行覆蓋率信息回傳控制,需要回傳覆蓋率數據時暫停或停止被測件運行,利用GEL(General Extended Language,即通用擴展語言)函數GEL_MemorySave()訪問被測系統內部存儲空間,將暫存的覆蓋率數據通過JTAG接口傳回至集成開發環境所在上位機,并將覆蓋率數據保存為數據文件。
在TMS320C6000系統嵌入式運行平臺上,以某星載軟件匯編代碼為實驗對象,搭建實驗平臺如圖3所示。

圖3 匯編代碼覆蓋測試實驗平臺
(1)運行時間開銷
為了驗證本文方案在運行時間開銷方面性能,分別對未插樁星載軟件運行時間、插樁后軟件采用傳統樁點數據傳輸方案運行時間、本文方案運行時間進行對比測試。其中,傳統樁點數據傳輸方案使用被測目標板上SPI接口將樁點數據逐一輸出。
本實驗中程序運行時間統計方法為:使用DSP芯片定時器Timer0的計數器值(CNT)對程序運行時間進行計時,計時精度為0.02μs。在程序開始時,設置計數器周期寄存器為上限值,以保證統計期間不會發生溢出,通過在程序運行開始處設置控制寄存器來啟動計時,在程序運行結束處讀取計數器值,得出代碼運行的時間。
實驗過程中,選取相同測試用例(均使被測軟件執行201984個樁點函數),得到運行時間結果如表4。

表4 運行時間開銷對比
(2)動態樁點數據存儲開銷
為了驗證本文方案在存儲資源開銷方面性能,選取以下3段程序進行實驗:
程序1:有限次循環程序;
程序2:單次執行程序;
程序3:無限循環程序。
為了便于定量對比,上述程序中均僅保留一個樁點,分別采用本文方案、傳統方案執行相同測試用例,產生的動態樁點數據量統計如表5。

表5 動態樁點數據存儲開銷對比
通過上述實驗數據可知,本文方案相對于樁點數據直接傳輸方案,在程序運行時間開銷方面下降97.5%;在動態樁點數據存儲開銷方面下降幅度超過96.8%,且樁點數量越多時,存儲開銷下降幅度越大。
實驗結果表明,本文的插樁策略和覆蓋率收集方法相對傳統方案在降低對嵌入式軟件時序影響和減少資源開銷方面的性能大大提升。
此外,本文方案已成功應用于某星載軟件評測工程項目,取得良好應用效果:在沒有商業工具支持的情況下,完成了覆蓋測試,且被測代碼語句、分支覆蓋率均達到100%。
設計實現了一種嵌入式匯編代碼覆蓋測試方案,提出了基于比特位表征方式的匯編插樁策略和基于JTAG接口的通用覆蓋率數據收集方案,解決了匯編覆蓋測試中插樁開銷大、覆蓋信息輸出通道受限等問題。實驗結果及工程應用效果表明本文方案在時間性能、存儲開銷及通用性等方面相對傳統方案均有顯著優勢。為嵌入式匯編代碼覆蓋測試常無法開展的問題提供了一種新的解決方法,下一步還需要對不同匯編指令集的通用自動插樁方法進行研究。
[1] 唐科,向渝,羅光春.匯編程序覆蓋測試中分支路徑數的計算[J].電子科技大學學報,2005,34(2): 235-239.(Tang Ke, Xiang Yu, Luo Guangchun, et al. An Algorithm for Calculating the Branch Routes of an Assembly Program in Software Coverage Testing [J]. Journal of UEST of China, 2005, 34(2): 235-239.)
[2] 張波.基于測試覆蓋的安全關鍵軟件測試策略研究[D]. 長春:中國科學院長春光學精密機械與物理研究所,2012.(Zhang Bo. A Study of Strategies about Testing Safety Critical Software Based on Testing Coverage [D]. Changchun: Changchun Institute of Optics, Fine Mechanics and Physics, Chinese Academy of Sciences, China, 2012.)
[3] Dong Ting ,Wang Zhongmin. Research on Instrumentation Technology for the Embedded Assembly Software Testing Based on Host Computer [C]// 2011 International Conference on Computer Science and Network Technology, Harbin,China, 2011. IEEE Press, 2011,3:1906-1909.
[4] 王學東,汪文勇.匯編程序覆蓋測試中虛擬插樁的實現[J].計算機工程, 2007, 33(7): 87-88.(Wang Xuedong, Wang Wenyong. Implementation of Virtual Instrumentation in Coverage Test of Assembly Code [J]. Computer Engineering, 2007, 33(7): 87-88.)
[5] 費訓,羅蕾. 利用GNU工具實現匯編程序覆蓋測試[J].計算機應用, 2004, 24(12): 95-98.(Fei Xun, Luo Lei. Implementation of Assembler Program Coverage Testing with GNU Tool [J]. Computer Applications, 2004, 24(12): 95-98.)
[6] 丁旭,崔吉崗,劉春裕.軍用嵌入式軟件結構覆蓋測試技術[J]. 指揮控制與仿真, 2008, 30(3): 120-122.(Ding Xu, Cui Jigang, Liu Chunyu. Test Technology of Procedure Structure Cover for Military Embedded Software [J]. Command Control & Simulation, 2008,30(3): 120-122.)
[7] Pankumhang T, Rutherford M J. Iterative Instrumentation for Code Coverage in Time-Sensitive Systems[C]//IEEE. International Conference on Software Testing, Verification and Validation.Graz,Austria,April,2015.IEEE Press,2015:1-10.
[8] 郭銳,李博,彭寶新. 用于覆蓋測試的代碼插樁程序設計與實現[J].科學技術與工程, 2013, 13(30): 9073-9077.(Guo Rui, Li Bo, Peng Baoxin. Design and Implementation of Instrumentor for Coverage Testing [J]. Science Technology and Engineering, 2013, 13(30): 9073-9077.)
[9] Fischmeister S, Lam P. Time-Aware Instrumentation of Embedded Software[J]. IEEE Transactions on Industrial Informatics, 2010, 6(4): 652-663.
[10] Arnold M, Ryder B G. A Framework for Reducing the Cost of Instrumented Code[J].Acm Sigplan Notices, 2003, 36(5): 168-179.
NovelAssembly-LanguageCodeCoverageTestingSchemeforEmbeddedAerospaceSoftware
Ma Yunyun, Zhang Chi, Wang Jinbo, Qu Yuelong
Technology and Engineering Center for Space Utilization, Chinese Academy of Science, Beijing 100094, China
Aneffectiveassembly-languagecodecoveragetestingschemeisdesignedandimplementedtosolvetheproblemthatthereisoftennoavailabletoolsupportsassembly-languagecodecoveragetestingintheaerospaceembeddedsystem.Thisschemeconsistsoftwopartsbycodeinstrumentationstrategyandcoveragedatacollectionmethod.Inviewofthecharacteristicsofembeddedsystem,suchasstricttimingrequirementandlimitedmemoryresources,acodeinstrumentationmethodwithbitbasedcoveragestateinformationexpressionstrategyisproposedonthebasisofresearchonassemblyinstructionstructure,andthenageneralassemblycoverageinformationcollectionmethodbyusingJTAGinterfaceisproposedtosolvetheproblemoflimitedcoverageoutputchannelinembeddedsystem.Theexperimentalresultsandengineeringpracticeshowsthattheschemegivenisfeasibleanduseful.
Coveragetesting;Softwaretesting;Embeddedsoftware;Codeinstrumentation

TP311
A
1006-3242(2017)05-0068-06
*載人航天國家重大專項(Y6140511RN)
2017-03-24
馬云云(1982-),女,山東人,碩士, 工程師,研究領域為高可靠軟件、嵌入式軟件評測;張弛(1990-),男,山東人,碩士, 助理工程師,研究領域為高可靠軟件、嵌入式軟件評測;王金波(1979-),男,江蘇人,博士,副研究員,研究領域為高可靠軟件;瞿躍龍(1972-),男,云南人,本科,高級工程師,研究領域為高可靠軟件、嵌入式軟件評測。