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