王永孟 馬利東
摘要:為了更好的保證軟件產(chǎn)品的質(zhì)量,本文介紹了目標(biāo)碼測(cè)試的必要性,測(cè)試工具的原理及運(yùn)用的約束條件。目標(biāo)碼測(cè)試需要工具的支持及對(duì)實(shí)現(xiàn)方法的摸索。
關(guān)鍵詞:目標(biāo)碼;語句分支覆蓋
引言
航天型號(hào)軟件的高可靠性、高安全性要求,促使軟件在各開發(fā)階段都需要經(jīng)過完整的測(cè)試,如:?jiǎn)卧獪y(cè)試、組裝測(cè)試、配置項(xiàng)測(cè)試、系統(tǒng)測(cè)試等。隨著航天飛行器的發(fā)展,航天產(chǎn)品功能越來越多強(qiáng)大,其軟件設(shè)計(jì)越來越復(fù)雜,越來越多的軟件采用C語言或高級(jí)語言編制。隨著C語言和其他高級(jí)語言編制的軟件越來越多,源代碼與目標(biāo)代碼差異可能產(chǎn)生的問題的幾率就越來越大。編譯器不同、編譯選項(xiàng)的不同都會(huì)產(chǎn)生的不同目標(biāo)代碼。人們開始遇到對(duì)目標(biāo)代碼分析不徹底而出現(xiàn)的質(zhì)量問題,對(duì)編譯選項(xiàng)認(rèn)識(shí)的不了解而產(chǎn)生的質(zhì)量問題;越來越多的人開始擔(dān)心實(shí)際運(yùn)行的目標(biāo)代碼是否會(huì)隱藏著潛在的危害,當(dāng)誘因成熟會(huì)對(duì)我們的產(chǎn)品帶來災(zāi)難的后果。所以目標(biāo)碼語句和分支的覆蓋率測(cè)試被提上了日程。目標(biāo)碼測(cè)試可以理解為真實(shí)運(yùn)行在CPU上的二進(jìn)制代碼所對(duì)應(yīng)的匯編代碼的執(zhí)行情況。
1目標(biāo)碼測(cè)試的必要性
首先舉個(gè)簡(jiǎn)單的例子。C語言a [i] = i是一條非常簡(jiǎn)單的賦值語句,在Keil C51的編譯環(huán)境下,對(duì)編譯選項(xiàng)開關(guān)“don't use absolute register accesses”進(jìn)行了簡(jiǎn)單的對(duì)比,產(chǎn)生的匯編指令如下表1所示。
通過上表可以看出,要想完全實(shí)現(xiàn)所有高級(jí)語言源代碼和目標(biāo)碼的一一對(duì)應(yīng)是件困難的事情,并且編譯選項(xiàng)給目標(biāo)代碼帶來的變化也是非常明顯。
軟件測(cè)試通過對(duì)語句和分支的覆蓋率指標(biāo)從一個(gè)方面來評(píng)估軟件測(cè)試的充分性,下面再舉一個(gè)Keil C51例子說明源代碼和目標(biāo)碼測(cè)試時(shí)語句和分支覆蓋率統(tǒng)計(jì)的差異。
在進(jìn)行測(cè)試時(shí)C語言的語句有2條,而匯編會(huì)有17條;分支C語言也是2條,而匯編語言就是由4條,JZ和JC語句分別有2個(gè)分支。在進(jìn)行源代碼測(cè)試時(shí)只需要2個(gè)測(cè)試用例即可完成測(cè)試,而目標(biāo)碼測(cè)試則需要3個(gè)測(cè)試用例來完全覆蓋分支的各種情況。上面這個(gè)例子可看出目標(biāo)碼測(cè)試要比源代碼測(cè)試的難度更大一些。
從這兩個(gè)例子可以看出,源代碼通過編譯器之后帶來的變化,雖然不能得出不進(jìn)行目標(biāo)碼測(cè)試,軟件的質(zhì)量就有問題或是對(duì)任務(wù)存在影響。但作為測(cè)試充分性的考量指標(biāo),源代碼和目標(biāo)碼的覆蓋率指標(biāo)所反映的內(nèi)容還是存在一定的差距。對(duì)于高級(jí)語言編寫的可重用模塊,如果編譯器不同,模塊重用就存在了一定的風(fēng)險(xiǎn)。
2如何實(shí)現(xiàn)目標(biāo)碼測(cè)試
任何代碼的覆蓋率測(cè)試都離不開工具的支持,除非微小型的軟件,花費(fèi)大量的人力完成統(tǒng)計(jì)。目前所了解到的測(cè)試工具能夠支持目標(biāo)碼測(cè)試的也是非常有限,其工作原理如下:測(cè)試工具通過對(duì)數(shù)據(jù)線和地址線上進(jìn)行采集,存儲(chǔ);之后對(duì)數(shù)據(jù)進(jìn)行分析,得出軟件運(yùn)行的情況??偩€上的數(shù)據(jù)都是二進(jìn)制的機(jī)器代碼,而每條匯編語句也對(duì)應(yīng)著一個(gè)二進(jìn)制機(jī)器代碼。如51匯編語言“MOV A,0x09”對(duì)應(yīng)的目標(biāo)代碼就為“E5 09”;如果數(shù)據(jù)總線上存在“E5 09”則認(rèn)為CPU執(zhí)行了這樣一條語句。
測(cè)試工具原理圖如圖1所示。其中,采集頭與被測(cè)環(huán)境根據(jù)實(shí)際情況進(jìn)行連接,采集設(shè)備主系統(tǒng)負(fù)責(zé)存儲(chǔ)和分析。采集設(shè)備與被測(cè)軟件之間沒有交互信息,不影響軟件的運(yùn)行情況。
根據(jù)上述原理完成目標(biāo)碼覆蓋率測(cè)試會(huì)有很多制約因素,比如:
◇CPU是否存在Catch;如果存在CPU就有預(yù)取功能,那么如何判別總線上出現(xiàn)的指令是否執(zhí)行就成了關(guān)鍵問題;需要一套完成的算法來識(shí)別出代碼執(zhí)行情況;
◇采集設(shè)備的運(yùn)行速度與CPU運(yùn)行速度;采集設(shè)備的速度一定是被采設(shè)備的倍數(shù);現(xiàn)在CPU運(yùn)行的速度越來越快,高速采集設(shè)備在抗干擾等方面要求很高;采集設(shè)備需要被測(cè)件提供可連接的接口;
◇被測(cè)軟件是否運(yùn)行在內(nèi)部存儲(chǔ)區(qū);如果在內(nèi)部存儲(chǔ)區(qū)就無法獲取被測(cè)軟件的運(yùn)行情況;
◇對(duì)應(yīng)不同的匯編語言,測(cè)試工具要對(duì)應(yīng)不同的分析軟件或分析軟件所調(diào)用的信息庫不同。
通過上述方法實(shí)現(xiàn)目標(biāo)碼測(cè)試只是目前的一種,是否還有更好的方法還有待研究。因?yàn)樵创a語句和分支覆蓋率的統(tǒng)計(jì)都是通過插樁的方法實(shí)現(xiàn),目標(biāo)碼是否也可以運(yùn)用類似的方法來實(shí)現(xiàn)?或是有更好的方法。
3目標(biāo)碼測(cè)試的好處
沒有提出目標(biāo)碼測(cè)試的概念之前,軟件測(cè)試充分性一般通過源代碼的語句和分支覆蓋情況進(jìn)行考量,更嚴(yán)格的還有條件覆蓋,條件組合覆蓋,路徑覆蓋等,對(duì)于后三種情況只是理論的考量方法實(shí)際工作中是很難完成的。為了進(jìn)一步提高語句和分支覆蓋,驗(yàn)證編譯器沒有對(duì)代碼帶來未知的影響,所以通過目標(biāo)碼語句和分支的覆蓋率測(cè)試來確保測(cè)試的充分性。
某型號(hào)軟件就發(fā)生過由于對(duì)目標(biāo)碼沒有進(jìn)行徹底分析而造成質(zhì)量問題的案例,也發(fā)生過對(duì)編譯器選項(xiàng)配置不一致而造成質(zhì)量問題的情況。隨著問題的被發(fā)現(xiàn),對(duì)測(cè)試的要求越來越高。在不斷的積累和探索中,必將會(huì)發(fā)現(xiàn)更好的方法,使開發(fā)和測(cè)試人員完全清晰掌握運(yùn)行在CPU上目標(biāo)碼的任何細(xì)節(jié)。
4結(jié)束語
目標(biāo)碼測(cè)試為提高軟件質(zhì)量,使軟件設(shè)計(jì)師和測(cè)試人員更充分掌握運(yùn)行代碼的確切情況是非常有幫助的。但無論是源代碼還是目標(biāo)碼的覆蓋率測(cè)試對(duì)工具的依賴是非常大的,沒有好的工具支撐是無法完成這項(xiàng)工作的。
參考文獻(xiàn):
[1][美]Bart Broekman,Edwin Notenboom.嵌入式軟件測(cè)試.北京:電子工業(yè)出版社.
[2][美]Parl C.Jorgensen.軟件測(cè)試(原書第二版).北京:機(jī)械工業(yè)出版社.