王正鋒 李紀(jì)波
摘 要發(fā)動機(jī)控制軟件多任務(wù)程序運(yùn)行時(shí),共享變量的處理容易發(fā)生數(shù)組訪問越界、除零、數(shù)據(jù)溢出等錯(cuò)誤,從而造成異常的后果。采用動態(tài)測試的方法檢測此類錯(cuò)誤成本大、效率低。本文借助PolySpace測試工具,模擬軟件動態(tài)運(yùn)行時(shí)的行為,使用靜態(tài)驗(yàn)證的方法有效檢測可能發(fā)生的運(yùn)行時(shí)錯(cuò)誤,更高效地發(fā)現(xiàn)多任務(wù)程序中的缺陷。
【關(guān)鍵詞】多任務(wù) 運(yùn)行時(shí)錯(cuò)誤 靜態(tài)測試 PolySpace
1 引言
航空發(fā)動機(jī)控制系統(tǒng)目前廣泛采用全權(quán)限數(shù)字電子控制系統(tǒng)(FADEC)。其中的控制軟件為高安全等級軟件,采用多中斷或者多任務(wù)的架構(gòu)設(shè)計(jì)。在軟件的設(shè)計(jì)過程中,很可能會出現(xiàn)多個(gè)任務(wù)或中斷服務(wù)程序?qū)蚕碜兞窟M(jìn)行操作的處理,對這處理的設(shè)計(jì)如果考慮不周全,很容易導(dǎo)致程序在運(yùn)行過程中出現(xiàn)數(shù)組訪問越界、除零、負(fù)數(shù)開方、整數(shù)或浮點(diǎn)數(shù)據(jù)溢出等錯(cuò)誤,產(chǎn)生預(yù)定義之外的不正確結(jié)果或者處理器異常復(fù)位等后果。
常規(guī)的測試手段對于上述程序運(yùn)行時(shí)錯(cuò)誤的檢測并不能起到很好的效果。使用PRQAC進(jìn)行靜態(tài)分析可以檢查代碼的編程規(guī)范、分析程序的靜態(tài)結(jié)構(gòu),但是并不分析代碼的動態(tài)行為。在真實(shí)環(huán)境中執(zhí)行動態(tài)測試,測試用例能夠覆蓋的場景有限,不一定能夠觸發(fā)錯(cuò)誤發(fā)生,尤其對于偶爾才出現(xiàn)的問題,需要大量重復(fù)測試才可能發(fā)現(xiàn)。除此之外,動態(tài)測試能夠發(fā)現(xiàn)異?,F(xiàn)象,但產(chǎn)生異常的原因還需要更多時(shí)間去定位,效率很低。
本文介紹了一種使用靜態(tài)驗(yàn)證的手段檢測多任務(wù)程序運(yùn)行時(shí)錯(cuò)誤的方法,借助工具軟件PolySpace,模擬軟件動態(tài)運(yùn)行時(shí)的行為,更高效地發(fā)現(xiàn)軟件缺陷。
2 測試原理
2.1 PolySpace的工作原理
PolySpace使用語義分析技術(shù),它依靠大量的數(shù)學(xué)定理提供的規(guī)則去分析軟件的動態(tài)行為,基于變量的數(shù)值范圍和變量之間的關(guān)系、程序的控制結(jié)構(gòu)、程序內(nèi)部過程之間的關(guān)系(函數(shù)調(diào)用)、多任務(wù)分析等進(jìn)行運(yùn)行時(shí)錯(cuò)誤的檢測。
其分析結(jié)果對程序運(yùn)行時(shí)可能會出現(xiàn)問題的代碼實(shí)現(xiàn),會給出橙色的告警標(biāo)識以及可能引發(fā)錯(cuò)誤的場景;對于肯定會出現(xiàn)問題的地方,會給出紅色告警和引發(fā)錯(cuò)誤的場景;對于不會出現(xiàn)問題的部分,會給出綠色的標(biāo)識。由于PolySpace分析驗(yàn)證時(shí)計(jì)算出的變量范圍始終是實(shí)際運(yùn)行時(shí)變量范圍的擴(kuò)展集,所以分析的結(jié)果不會漏掉可能出現(xiàn)的錯(cuò)誤。
根據(jù)給出的告警和場景,進(jìn)一步通過人工分析和確認(rèn),最終定位問題。
2.2 多任務(wù)程序運(yùn)行時(shí)錯(cuò)誤的分析
在基本的語義分析基礎(chǔ)上,對于多任務(wù)分析,還有一些必備的條件和假設(shè):
(1)main函數(shù)是可結(jié)束的,即結(jié)尾的“}”必須可達(dá);不存在無限循環(huán)或者引起紅色告警的錯(cuò)誤,這樣才能保證多任務(wù)入口函數(shù)可以開始分析。
(2)任務(wù)或者是中斷/線程列表,其函數(shù)原型必須為void func_name(void)的形式。
(3)main函數(shù)結(jié)束后,開始分析各任務(wù)或者入口函數(shù),分析的時(shí)候不會限定任務(wù)或中斷服務(wù)程序運(yùn)行的順序和優(yōu)先級(不影響分析結(jié)果)。
(4)由于不能明確地構(gòu)建任務(wù)的具體優(yōu)先級,所以分析時(shí)會模擬所有可能的優(yōu)先級順序。
如果要分析的源程序不滿足這些條件和假設(shè),需要人工對程序進(jìn)行修改以滿足要求,以便進(jìn)行分析。另外,可以通過人工編寫樁函數(shù)來調(diào)用實(shí)際的任務(wù)程序,使多任務(wù)的分析更接近實(shí)際運(yùn)行場景。
3 項(xiàng)目應(yīng)用實(shí)踐
在某項(xiàng)目發(fā)動機(jī)控制軟件中,曾經(jīng)出現(xiàn)過兩個(gè)任務(wù)對共享的數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作,其中一個(gè)任務(wù)對數(shù)據(jù)結(jié)構(gòu)中的元素進(jìn)行除法運(yùn)算,出現(xiàn)除零操作而導(dǎo)致程序運(yùn)行異常的問題。以下內(nèi)容將對問題進(jìn)行描述,并介紹通過Polyspace進(jìn)行多任務(wù)分析檢測出此問題的實(shí)踐。
3.1 軟件問題概述
某項(xiàng)目控制軟件中存在多個(gè)中斷處理程序,其中頻率量的采集處理在兩個(gè)定時(shí)任務(wù)中實(shí)現(xiàn)。5ms定時(shí)中斷任務(wù)中讀取計(jì)數(shù)值,優(yōu)先級稍低的25ms任務(wù)將計(jì)數(shù)值當(dāng)作除數(shù),計(jì)算頻率量。如圖1所示。
軟件設(shè)計(jì)之初考慮到這個(gè)FreqBuff[0]可能為0,因此在做除法之前做了極小值保護(hù)(使FreqBuff > 1000)保護(hù),防止由于其等于0而出現(xiàn)除0的情況。
但是5ms定時(shí)中斷優(yōu)先級高于25ms中斷,如果由于時(shí)序原因,如果恰好在所做的除零保護(hù)之后,25ms任務(wù)被更高優(yōu)先級的5ms定時(shí)任務(wù)打斷,F(xiàn)reqBuff[0]賦值為0,再回到25ms任務(wù)進(jìn)行除以FreqBuff[0]的運(yùn)算時(shí)將會出現(xiàn)除零的錯(cuò)誤,軟件運(yùn)行出現(xiàn)異常。問題示意如圖1所示。
此問題引發(fā)的異常表象,不是每次運(yùn)行都會出現(xiàn),即使出現(xiàn)該問題引發(fā)的異常,進(jìn)行故障排查和原因定位也要耗費(fèi)大量的時(shí)間和人力,同時(shí)對排故人員的能力和經(jīng)驗(yàn)要求也比較高。
如果在開發(fā)階段或分析審查階段就能找出這個(gè)問題,會節(jié)約很大成本。
3.2 借助Polyspace進(jìn)行分析
進(jìn)行多任務(wù)程序分析的總體執(zhí)行步驟為:先初始化全局變量,然后分析main函數(shù),main函數(shù)正常結(jié)束后分析多個(gè)任務(wù)程序的運(yùn)行。
Polyspace不會自動識別需要分析哪些任務(wù),需要對原代碼進(jìn)行一些改造、打樁或編寫驅(qū)動程序來保證分析過程可以正常結(jié)束。
首先,對main函數(shù)進(jìn)行改造。原代碼的main函數(shù)中存在一個(gè)無限循環(huán),可以將循環(huán)中執(zhí)行的函數(shù)拿到main函數(shù)外作為一個(gè)單獨(dú)的任務(wù)進(jìn)行分析。這樣可以保證main函數(shù)能正常結(jié)束,且不會漏掉循環(huán)中執(zhí)行的函數(shù)的分析,具體更改如圖2所示。
然后手動編制樁函數(shù),調(diào)用要分析的多個(gè)任務(wù)程序。該項(xiàng)目中共有兩個(gè)定時(shí)器中斷和串口、AD采集、DMA應(yīng)答、通訊中斷等多個(gè)中斷服務(wù)程序,僅考慮要分析的兩個(gè)定時(shí)中斷任務(wù),它們的函數(shù)原型為VOID IsrTimer1(VOID) 和VOID IsrTimer2(VOID),符合能夠進(jìn)行分析的條件,無需改動。自己建立一個(gè)C文件,如Poly_multitsk.c一起加入到工程中,手動編寫的驅(qū)動函數(shù)如圖3所示。
這樣的驅(qū)動函數(shù)可以模擬每個(gè)中斷服務(wù)函數(shù)被調(diào)用0次或者多次,且各任務(wù)相互之間可被打斷。
最后,對分析選項(xiàng)進(jìn)行必要的配置。除了一些通用的配置選項(xiàng),在Multitasking選項(xiàng)中,設(shè)置好要分析的多任務(wù)的任務(wù)入口函數(shù),這里包括我們手動編寫的兩個(gè)驅(qū)動函數(shù)和之前從main函數(shù)中摘出的一個(gè)循環(huán)任務(wù)。配置完成,即可在服務(wù)器端進(jìn)行分析。
3.3 查看結(jié)果和人工分析
分析結(jié)束,Polyspace會產(chǎn)生結(jié)果文件,可以很容易查看分析后給出的各類告警。對于前面提到的程序中存在的問題,分析結(jié)果中給出了橙色的告警指示,如圖4所示。
結(jié)果中會明確給出可能出現(xiàn)錯(cuò)誤的代碼所在的函數(shù)和文件,而且點(diǎn)擊告警處,可顯示導(dǎo)致錯(cuò)誤的操作和場景,即除法運(yùn)算的右側(cè)操作數(shù)可能為0。然后進(jìn)一步分析可能導(dǎo)致除數(shù)為0的原因,是在另一個(gè)優(yōu)先級更高的中斷任務(wù)中將這里作為除數(shù)的全局變量賦為0。
上述內(nèi)容是對某項(xiàng)目程序中已知存在的問題進(jìn)行實(shí)際的分析和驗(yàn)證,只對兩個(gè)任務(wù)的交叉運(yùn)行進(jìn)行分析來舉例說明??筛鶕?jù)實(shí)際情況分析更多的任務(wù),模擬更多的任務(wù)運(yùn)行模式進(jìn)行分析。
4 總結(jié)
在項(xiàng)目開發(fā)階段或早期的測試階段,根據(jù)實(shí)際需要,對程序中的多任務(wù)進(jìn)行分析,可以盡早的發(fā)現(xiàn)可能出現(xiàn)的運(yùn)行時(shí)錯(cuò)誤。這些自動分析產(chǎn)生的可能發(fā)生錯(cuò)誤的告警,并不一定會在真實(shí)運(yùn)行時(shí)發(fā)生,根據(jù)這些信息,結(jié)合實(shí)際代碼對告警的內(nèi)容進(jìn)行更進(jìn)一步的人工確認(rèn)和分析,直到找出問題的根本原因,是必不可少而且至關(guān)重要的工作。
借助Polyspace進(jìn)行自動分析需要的準(zhǔn)備工作和后續(xù)的人工分析確認(rèn),需要花費(fèi)一定的時(shí)間,但相對于軟件使用和維護(hù)階段再去對這些運(yùn)行時(shí)錯(cuò)誤進(jìn)行排查和定位,成本是很低的,效率也大大提高,是非常有效的檢測多任務(wù)程序中運(yùn)行時(shí)錯(cuò)誤的方法。
參考文獻(xiàn)
[1]劉春裕,王蕾.基于PolySpace的嵌入式軟件內(nèi)存測試[J].電腦技術(shù)與技術(shù),2010,6(01):85-87.
[2]PolySpace Products for C Users Guide:5-19.
作者單位
中國航發(fā)控制系統(tǒng)研究所 江蘇省無錫市 214063