萇瑤,陸志肖,吳麗媛,宋治惠,胡尊帆
(中國直升機設計研究所 機電軟件專業,天津,300300)
航空電子技術不斷發展,現代飛機的體系架構已逐漸向模塊化、高度綜合化方向發展,軟件實現的功能在航空電子系統中的地位越來越重要。航空機載軟件具有嵌入式、實時性、結構復雜、高安全關鍵等級等特點[1],航空機載軟件可靠性決定了航空電子系統乃至整個航空器的質量[2],成了機載設備發揮其優越性能的一個制約因素。軟件測試是保障航空機載軟件可靠性的重要手段[3],也是機載軟件全生存周期缺陷管理和分析的關鍵環節[4]。
機載軟件質量的影響因素有很多,應通過提高軟件測試的充分性,在開發階段和測試階段都進行充分的軟件測試,以盡早發現軟件問題,從而提高軟件的可靠性。而軟件測試的工作量很大,據統計,測試時間會占到總開發周期時間的40%~60%。測試的許多操作和過程是重復性的,因此在整個軟件過程中軟件測試可以應用自動化的測試工具,提高測試的速度、效率和準確度[5]。
航空機載軟件開發過程周期較長,即使軟件開發完成后也很難立刻使用目標機進行測試,且開發人員和測試人員不能同時進行測試[6]。航空機載軟件一般使用C 語言編寫,C語言是一個功能強大且高度靈活的編程語言,被廣泛應用于各種嵌入式系統中,但靈活的同時也容易被開發人員誤用導致代碼存在運行時錯誤。運行時錯誤是指那些能導致預定義之外的不正確結果或者處理器停機的錯誤,它是所有的軟件錯誤中最具風險的,如數組越界、整數被零除、值溢出、非法的指針訪問等。一旦發生輕則導致軟件不能正常運行,重則導致系統崩潰。根據IBM-Berkeley 調查統計,在每一千行的代碼中大約就會發現一個運行時錯誤,而且在軟件的維護階段所檢測到的錯誤中有30%~40%是運行時錯誤,可見運行時錯誤對軟件質量的影響較大。而軟件中的運行時錯誤是很難被發現的,采用傳統的測試工具不能檢測到或很難檢測到軟件運行時錯誤,這對于可靠性要求極高的機載軟件存在巨大風險。因此我們應當采取一些措施及時發現并消除這類代碼的運行時錯誤,在開發階段的初期對代碼進行運行時錯誤檢查,可以避免在后期測試和產品維護階段發現更多的問題。使用運行時錯誤檢查工具,能夠快速地、自動化地檢測到軟件中的運行時錯誤,且能盡早地檢測到運行時錯誤,能夠節省測試階段的時間和費用,極大地提高了軟件可靠性。本文針對機載軟件難以在開發初期檢測出運行時錯誤的問題,使用Astree 對代碼進行測試分析。通過測試可盡早發現軟件開發過程的中的運行時錯誤,以提高代碼的開發效率,從而有效避免了軟件在機載產品上出現嚴重的質量問題。
Astree 是一個靜態程序分析器,用于檢查C 語言程序中是否存在運行時錯誤。其使用的是語義分析技術,通過對源代碼分析并生成中間語言,產生代碼的數據流圖和控制流圖,對程序所有的可執行路徑中所有變量取值進行近似,采用近似后的取值超集,驗證代碼的執行路徑是否會引起運行時錯誤,從而能達到代碼測試路徑的100%覆蓋,并檢查出軟件中的運行時錯誤[7]。該軟件分析的是預處理后代碼,本文通過調用C 編譯器使用同樣的編譯選項對源代碼編譯產生預處理代碼,將預處理后的代碼添加到Astree 工程中。Astree 對代碼進行分析時,需要進行參數設置,點擊Analysis entry 設置分析入口函數。分析的入口函數,可以為主函數,也可以為其他中斷函數或者任意子函數。一旦設定后,Astree 會以這個函數為入口,分析所有可達的代碼部分的運行時錯誤。本文對機載軟件中的Main 函數進行分析,完成配置后,點擊開始圖標,進行代碼測試分析。
軟件分析測試結束后,可在多個窗口中查看多種分析結果。工程統計信息窗口顯示了工程的錯誤數,警告數以及覆蓋率。紅綠燈熄滅時代表工程還沒有進行分析,或者分析仍在進行但是目前為止還沒有發現任何錯誤或報警。分析結束后,軟件的測試結果通過紅黃綠燈顯示。

圖1 入口函數設置
(a)紅燈:表示存在錯誤A 類型報警,A 類錯誤是由未定義行為引起的錯誤、越界、被0 整除、浮點表達式等(引起不可預知的結果)。如果發生A 類錯誤,分析程序將停止對上下文的操作,因為沒有可行的延續;
(b)黃燈:表示有B/C 類型報警,其中B 類錯誤代表存在數據競爭,包括讀寫數據競爭和寫寫數據競爭,這類警告不會停止對告警發生上下文的分析。C 類錯誤代表溢出類錯誤、整型溢出、無效移位等(運行時錯誤導致不明確的,但是可預計的行為);
(c)綠燈:分析結束后,沒有發現任何錯誤和報警。
本文代碼分析結果為紅燈如圖2 所示,結果表明Main函數代碼中存在運行時錯誤。

圖2 工程統計信息窗口初始結果
Findings/C 窗口按類型分組顯示警告信息,本文函數測試分析后的Findings/C 窗口結果如圖3 所示。

圖3 Findings/C 窗口初始結果
通過Findings/C 窗口可以看到函數中存在數組越界的告警,通過查看報錯代碼,發現了數組使用超出定義的8 處錯誤。在軟件開發的過程中,這種問題較為常見,而通過人工審查又很難發現問題。本文通過Astree 對代碼進行分析,幾秒鐘的時間就可以發現越界問題,避免了代碼跑飛問題的出現。在預處理后的文件中可直接修改數組越界的錯誤,重新分析代碼后,發現越界告警消失,如圖4 所示。

圖4 更改代碼后Findings/C 窗口的結果
將數組越界問題更改后,可以看到告警燈也由紅色變成了黃色。

圖5 更改代碼后工程統計信息窗口的結果
查看Reachability 窗口,可以看到分析的函數代碼覆蓋率為67%,分析的函數中有31 行代碼未覆蓋。因此這31 行代碼不能確定是否存在運行時錯誤,需要查看代碼,更改不可達分支部分,提高覆蓋率至100%,對全部代碼進行測試分析。

圖6 代碼初始覆蓋率

表1 代碼初始覆蓋率信息
查看Not Reached 窗口找到不可達分支如圖7 所示,修改不可達部分的代碼。Astree 代碼分析時按照初始值進行邏輯判斷,需要對變量運算后的結果進行判斷的,可通過“__ASTREE_modify((V1,…,Vn; effect))”修 改 變 量 值的范圍,完成代碼修改后進行測試分析,代碼覆蓋率已達100%,這時可分析整個函數的代碼,結果如圖8、9 所示。分析結果顯示,紅色告警已消除,此時代碼已不存在不可預知的錯誤。

圖7 函數中不可達分支

圖8 函數代碼最終覆蓋率

圖9 Findings/C 窗口最終結果
本文通過使用Astree 對軟件進行測試分析,發現該軟件能夠更快并且更精確地發現代碼問題,可避免誤報導致大量的人工分析。Astree 為嵌入式系統提供先進的測試工具,能夠盡早發現機載軟件中的運行時錯誤,為軟件開發提供技術支持,可保障軟件開發的質量和效率,節省測試階段的時間和人力成本。通過Astree 測試應用,發現其具備以下特點:
(a)在編譯階段就能檢測出軟件的運行時錯誤,將代碼放在Astree 測試環境下,經過簡單配置后,便可自動測試代碼是否存在運行時錯誤;
(b)測試時無需編寫測試用例,傳統的覆蓋率測試需要花費大量時間精力開發測試用例,而使用Astree 可自動生成用例,不需要人工編寫;
(c)測試時無須設置代碼插裝,也不必改變開發過程;
(d)分析準確性高,可實現“零誤報”;
(e)分析速度快,幾秒鐘可完成一個函數測試。
本文首先介紹了軟件測試技術,并提出了目前機載軟件測試存在的困難。本文使用Astree 對代碼進行分析和測試,發現了代碼中的越界問題,并可分析代碼的覆蓋率。發現了代碼中存在不可達分支,通過更改錯誤代碼,將覆蓋率提高至100%,重新對代碼進行測試分析,代碼不存在不可預知的錯誤,降低了軟件的風險。該測試方法為軟件開發階段提供了技術支持,使開發人員盡早發現代碼中的問題,從而提高代碼的質量和可靠性。本文研究了軟件運行時錯誤的測試方法,機載軟件測試過程中還存在其他問題,測試工具的使用和測試方法仍需繼續研究。