(上海工業(yè)自動化儀表研究院1,上海 200233;上海儀器儀表自控檢驗測試所功能安全中心2,上海 200233)
功能安全軟件的一切驗證和確認活動主要是為檢驗與評估軟件是否已正確執(zhí)行其產(chǎn)品的安全功能。軟件驗證主要針對安全完整性等級要求的程度,測試和評估軟件安全生命周期在給定階段的輸出,保證該階段輸出對于相應(yīng)輸入的正確性和一致性;軟件確認主要是為了證明安全相關(guān)產(chǎn)品在軟硬件集成后符合軟件安全要求規(guī)定。本文所述的軟件驗證是指狹義的軟件安全生命周期中后期的靜態(tài)代碼復(fù)審、模塊測試、集成測試階段的驗證技術(shù),主要是動態(tài)的,與上述安全生命周期的早期的幾個階段不同,因為前期的驗證主要是靜態(tài)的。
本文的軟件驗證技術(shù)主要是軟件測試,它是軟件代碼實現(xiàn)后(除代碼復(fù)審?fù)?一切驗證與確認活動的主要方法,其首要條件是最好考慮到軟件驗證的獨立性,必須由開發(fā)人員外的專業(yè)領(lǐng)域測試人員進行,避免陷入開發(fā)人員既定的編程思維,從而不利于算法優(yōu)化、代碼優(yōu)化,避免代碼重用等錯誤。
代碼復(fù)審可依靠多種代碼檢查方式來完成,包括軟件審查、人工走查和形式化檢查。代碼復(fù)審是針對軟件的整個源代碼,不管是一般芯片自帶的、編譯器自動生成的和人工開發(fā)的代碼,都要進行軟件走查和人工走查,一般同時進行,相輔相成;而形式化檢查是否需要,則按安全完整性等級和軟件模塊設(shè)計規(guī)范選擇。
為達到軟件安全完整性等級的要求,源代碼應(yīng)需具有以下代碼屬性:可讀、可理解、可測試性;滿足軟件模塊設(shè)計的規(guī)定要求;滿足編碼標準的規(guī)定要求;滿足安全計劃編制中規(guī)定的所有相關(guān)要求。
軟件走查的主要任務(wù)是依據(jù)制定好的軟件編碼標準和已選擇的軟件測試工具對源代碼進行分析,從而生成代碼復(fù)審報告;然后讓開發(fā)人員針對違背編碼標準的語句在不會影響整個模塊設(shè)計的前提下(如果確認為模塊設(shè)計的問題,則重回模塊設(shè)計階段修改驗證)進行修改,直到順利通過編碼標準為止;最后如果存在軟件和硬件的實際需求而無法通過編碼標準的語句,則須針對每條語句給予違背編碼規(guī)則說明文檔記錄。
人工走查的主要工作是依據(jù)《軟件詳細設(shè)計說明》對源代碼進行分析,確保所有代碼是執(zhí)行預(yù)定功能且不執(zhí)行其非預(yù)定功能,去除一切重復(fù)、無用、錯誤的代碼;除此之外還要針對軟件走查的代碼復(fù)審報告進行逐條語句驗證與確認,該條語句是否確實違背編碼規(guī)則。這個檢查工作非常關(guān)鍵,需復(fù)審人員耐心地讀懂程序并仔細地推敲其是否與《軟件詳細設(shè)計說明》達成一致性、正確性、完整性。
形式化檢查一般在安全相關(guān)產(chǎn)品規(guī)定的軟件安全功能和軟件系統(tǒng)性能能力較高且軟件系統(tǒng)比較復(fù)雜的情況下使用,是一種動態(tài)的分析方法;使用某種嚴格的數(shù)學方法來證明復(fù)雜的軟件不存在數(shù)據(jù)溢出、內(nèi)存泄露、未初始化的內(nèi)存、被零除和指針越界等運行時錯誤。該方法也能靠軟件測試工具支持。
代碼復(fù)審的執(zhí)行過程如圖1所示。
圖1 代碼復(fù)審的執(zhí)行過程
測試軟件模塊是對代碼實現(xiàn)和軟件模塊設(shè)計的驗證,與代碼復(fù)審相結(jié)合,用于確保軟件模塊設(shè)計滿足其相關(guān)規(guī)范。該階段重點是選用合適的測試方法對軟件模塊的具體實現(xiàn)、內(nèi)部的邏輯結(jié)構(gòu)、數(shù)據(jù)流向等進行全面的測試,除了功能需求,還要增加非正常邏輯的測試,而這些是影響到軟件單元測試充分性的關(guān)鍵,最終確保軟件執(zhí)行其預(yù)定功能且不執(zhí)行其非預(yù)定功能。
功能安全軟件的模塊測試在開始前一般應(yīng)具備以下條件:模塊測試規(guī)范及計劃(模塊設(shè)計階段已生成);所提交的被測軟件版本受控(源代碼清單);源代碼已正確通過編碼規(guī)則檢查(代碼復(fù)審報告);源代碼已正確通過編譯或匯編;軟件詳細設(shè)計說明;已搭建好的測試環(huán)境(包括測試的運行環(huán)境和測試工具環(huán)境)。采用的測試方法為白盒,在其基礎(chǔ)上確定測試需要的其他配套技術(shù)及方法,如測試數(shù)據(jù)生成與驗證技術(shù)、測試數(shù)據(jù)輸入技術(shù)、測試結(jié)果獲取技術(shù)。
設(shè)計測試用例一般需考慮下面幾個方法:邊界值分析;控制流分析;接口分析;等價類方法;形式化證明或斷言;量化的統(tǒng)計證據(jù)。
功能安全軟件的模塊測試活動流程如圖2所示。模塊測試各階段的輸入、輸出如圖3所示。
圖2 軟件模塊測試活動流程
圖3 模塊測試中各階段的主要數(shù)據(jù)流
根據(jù)模塊測試計劃中測試須達到的覆蓋率水平等進行結(jié)果核對,判斷是否出現(xiàn)異?;蛐枰a充測試用例情況,如出現(xiàn)相應(yīng)的情況應(yīng)做出對應(yīng)的處理,其具體流程如圖4所示。
圖4 結(jié)果核對活動的控制流程
最后應(yīng)對測試執(zhí)行活動、模塊測試文檔(包括模塊測試報告、測試用例、測試記錄、測試日志和測試異常報告等)進行評審。評審一般包括下面幾點內(nèi)容:測試執(zhí)行活動的有效性;測試結(jié)果的正確性、完備性和合理性;整個測試過程是否達到了模塊測試規(guī)范的要求;測試中所有生成的文檔是否符合規(guī)范。
結(jié)束模塊測試工作一般應(yīng)具備以下條件:已按要求完成了模塊測試規(guī)范所規(guī)定的測試任務(wù);實際測試過程遵循了原定的軟件測試計劃要求;客觀、詳細地記錄了測試過程和測試中發(fā)現(xiàn)的所有問題;測試文檔齊全、符合規(guī)范;測試的全過程自始至終在控制下進行;測試中的問題或異常有合理解釋或正確有效的處理;全部測試工具、被測軟件、測試支持軟件和評審結(jié)果已納入配置管理。
功能安全軟件由于通常是嵌入式軟件,所以集成有兩個概念,一個是純粹的軟件模塊集成,一個是硬件和軟件相結(jié)合的可編程電子集成,本文所述的集成是沒有硬件參與的軟件集成。軟件集成測試主要是驗證所有軟件模塊相互作用以實現(xiàn)其預(yù)定功能而不實現(xiàn)非預(yù)定功能,確保軟件系統(tǒng)滿足安全功能和系統(tǒng)性能力的特定要求。功能安全軟件的集成測試活動流程如表1所示。
對具體的安全相關(guān)產(chǎn)品的軟件,可根據(jù)軟件安全功能和軟件系統(tǒng)性能力選擇適當?shù)募蓽y試技術(shù)。軟件集成測試一般應(yīng)符合以下要求:①對集成軟件進行必要的靜態(tài)分析;②采用自底向上增量集成法,測試新組裝的軟件集成;③逐項測試軟件概要設(shè)計文檔規(guī)定的軟件的功能、性能等特性;④測試軟件之間、軟件和硬件之間的所有接口;⑤測試運行條件(如數(shù)據(jù)結(jié)構(gòu)、輸入/輸出通道容量、內(nèi)存空間、調(diào)用頻率等)在邊界狀態(tài)下和人為設(shè)定的狀態(tài)下軟件的功能和性能;⑥應(yīng)按概要設(shè)計文檔要求,對軟件的功能、性能進行強度測試;⑦對執(zhí)行安全功能代碼進行安全性分析,明確每一個故障狀態(tài)和導致故障的可能原因,并對執(zhí)行安全功能代碼進行針對性、重復(fù)性的測試。
表1 軟件集成測試活動流程
功能安全軟件的驗證與確認貫穿于安全相關(guān)產(chǎn)品軟件實現(xiàn)的全過程。由于該活動是可重復(fù)性的,所以配置管理至關(guān)重要,以便后期如果出現(xiàn)事故查找故障出處。
同時,還要注重安全軟件本身的特性:
① 無移植性,針對軟件使用的特定環(huán)境而開發(fā)的功能安全軟件,其如需移植,則必須重新測試使用平臺;
② 靈活性,在保證完成安全功能的前提下要保持軟件操作等的靈活性;
③ 效率性,安全軟件主要是實現(xiàn)安全功能,如果沒有產(chǎn)品特別需求,這個不需太強求;
④ 正確性,這個是必須要遵循的,整個驗證和確認過程都是為了證明這一點。