(上海工業自動化儀表研究院1,上海 200233;上海儀器儀表自控檢驗測試所功能安全中心2,上海 200233)
功能安全軟件的一切驗證和確認活動主要是為檢驗與評估軟件是否已正確執行其產品的安全功能。軟件驗證主要針對安全完整性等級要求的程度,測試和評估軟件安全生命周期在給定階段的輸出,保證該階段輸出對于相應輸入的正確性和一致性;軟件確認主要是為了證明安全相關產品在軟硬件集成后符合軟件安全要求規定。本文所述的軟件驗證是指狹義的軟件安全生命周期中后期的靜態代碼復審、模塊測試、集成測試階段的驗證技術,主要是動態的,與上述安全生命周期的早期的幾個階段不同,因為前期的驗證主要是靜態的。
本文的軟件驗證技術主要是軟件測試,它是軟件代碼實現后(除代碼復審外)一切驗證與確認活動的主要方法,其首要條件是最好考慮到軟件驗證的獨立性,必須由開發人員外的專業領域測試人員進行,避免陷入開發人員既定的編程思維,從而不利于算法優化、代碼優化,避免代碼重用等錯誤。
代碼復審可依靠多種代碼檢查方式來完成,包括軟件審查、人工走查和形式化檢查。代碼復審是針對軟件的整個源代碼,不管是一般芯片自帶的、編譯器自動生成的和人工開發的代碼,都要進行軟件走查和人工走查,一般同時進行,相輔相成;而形式化檢查是否需要,則按安全完整性等級和軟件模塊設計規范選擇。
為達到軟件安全完整性等級的要求,源代碼應需具有以下代碼屬性:可讀、可理解、可測試性;滿足軟件模塊設計的規定要求;滿足編碼標準的規定要求;滿足安全計劃編制中規定的所有相關要求。
軟件走查的主要任務是依據制定好的軟件編碼標準和已選擇的軟件測試工具對源代碼進行分析,從而生成代碼復審報告;然后讓開發人員針對違背編碼標準的語句在不會影響整個模塊設計的前提下(如果確認為模塊設計的問題,則重回模塊設計階段修改驗證)進行修改,直到順利通過編碼標準為止;最后如果存在軟件和硬件的實際需求而無法通過編碼標準的語句,則須針對每條語句給予違背編碼規則說明文檔記錄。
人工走查的主要工作是依據《軟件詳細設計說明》對源代碼進行分析,確保所有代碼是執行預定功能且不執行其非預定功能,去除一切重復、無用、錯誤的代碼;除此之外還要針對軟件走查的代碼復審報告進行逐條語句驗證與確認,該條語句是否確實違背編碼規則。這個檢查工作非常關鍵,需復審人員耐心地讀懂程序并仔細地推敲其是否與《軟件詳細設計說明》達成一致性、正確性、完整性。
形式化檢查一般在安全相關產品規定的軟件安全功能和軟件系統性能能力較高且軟件系統比較復雜的情況下使用,是一種動態的分析方法;使用某種嚴格的數學方法來證明復雜的軟件不存在數據溢出、內存泄露、未初始化的內存、被零除和指針越界等運行時錯誤。該方法也能靠軟件測試工具支持。
代碼復審的執行過程如圖1所示。

圖1 代碼復審的執行過程
測試軟件模塊是對代碼實現和軟件模塊設計的驗證,與代碼復審相結合,用于確保軟件模塊設計滿足其相關規范。該階段重點是選用合適的測試方法對軟件模塊的具體實現、內部的邏輯結構、數據流向等進行全面的測試,除了功能需求,還要增加非正常邏輯的測試,而這些是影響到軟件單元測試充分性的關鍵,最終確保軟件執行其預定功能且不執行其非預定功能。
功能安全軟件的模塊測試在開始前一般應具備以下條件:模塊測試規范及計劃(模塊設計階段已生成);所提交的被測軟件版本受控(源代碼清單);源代碼已正確通過編碼規則檢查(代碼復審報告);源代碼已正確通過編譯或匯編;軟件詳細設計說明;已搭建好的測試環境(包括測試的運行環境和測試工具環境)。采用的測試方法為白盒,在其基礎上確定測試需要的其他配套技術及方法,如測試數據生成與驗證技術、測試數據輸入技術、測試結果獲取技術。
設計測試用例一般需考慮下面幾個方法:邊界值分析;控制流分析;接口分析;等價類方法;形式化證明或斷言;量化的統計證據。
功能安全軟件的模塊測試活動流程如圖2所示。模塊測試各階段的輸入、輸出如圖3所示。

圖2 軟件模塊測試活動流程

圖3 模塊測試中各階段的主要數據流
根據模塊測試計劃中測試須達到的覆蓋率水平等進行結果核對,判斷是否出現異常或需要補充測試用例情況,如出現相應的情況應做出對應的處理,其具體流程如圖4所示。

圖4 結果核對活動的控制流程
最后應對測試執行活動、模塊測試文檔(包括模塊測試報告、測試用例、測試記錄、測試日志和測試異常報告等)進行評審。評審一般包括下面幾點內容:測試執行活動的有效性;測試結果的正確性、完備性和合理性;整個測試過程是否達到了模塊測試規范的要求;測試中所有生成的文檔是否符合規范。
結束模塊測試工作一般應具備以下條件:已按要求完成了模塊測試規范所規定的測試任務;實際測試過程遵循了原定的軟件測試計劃要求;客觀、詳細地記錄了測試過程和測試中發現的所有問題;測試文檔齊全、符合規范;測試的全過程自始至終在控制下進行;測試中的問題或異常有合理解釋或正確有效的處理;全部測試工具、被測軟件、測試支持軟件和評審結果已納入配置管理。
功能安全軟件由于通常是嵌入式軟件,所以集成有兩個概念,一個是純粹的軟件模塊集成,一個是硬件和軟件相結合的可編程電子集成,本文所述的集成是沒有硬件參與的軟件集成。軟件集成測試主要是驗證所有軟件模塊相互作用以實現其預定功能而不實現非預定功能,確保軟件系統滿足安全功能和系統性能力的特定要求。功能安全軟件的集成測試活動流程如表1所示。
對具體的安全相關產品的軟件,可根據軟件安全功能和軟件系統性能力選擇適當的集成測試技術。軟件集成測試一般應符合以下要求:①對集成軟件進行必要的靜態分析;②采用自底向上增量集成法,測試新組裝的軟件集成;③逐項測試軟件概要設計文檔規定的軟件的功能、性能等特性;④測試軟件之間、軟件和硬件之間的所有接口;⑤測試運行條件(如數據結構、輸入/輸出通道容量、內存空間、調用頻率等)在邊界狀態下和人為設定的狀態下軟件的功能和性能;⑥應按概要設計文檔要求,對軟件的功能、性能進行強度測試;⑦對執行安全功能代碼進行安全性分析,明確每一個故障狀態和導致故障的可能原因,并對執行安全功能代碼進行針對性、重復性的測試。

表1 軟件集成測試活動流程
功能安全軟件的驗證與確認貫穿于安全相關產品軟件實現的全過程。由于該活動是可重復性的,所以配置管理至關重要,以便后期如果出現事故查找故障出處。
同時,還要注重安全軟件本身的特性:
① 無移植性,針對軟件使用的特定環境而開發的功能安全軟件,其如需移植,則必須重新測試使用平臺;
② 靈活性,在保證完成安全功能的前提下要保持軟件操作等的靈活性;
③ 效率性,安全軟件主要是實現安全功能,如果沒有產品特別需求,這個不需太強求;
④ 正確性,這個是必須要遵循的,整個驗證和確認過程都是為了證明這一點。