高玉娜
(上海海洋大學 工程學院,上海 201306)
軟件的安全和可靠性是衡量軟件質量最重要的指標和軟件開發的最終目標。較之普通軟件領域,在高安全性的嵌入式開發領域如軌道交通,航空,國防等,軟件因其任務特點,更需要保證高可靠性。然而,何謂“高可靠性軟件”、如何開發“高可靠性軟件”一直是困擾系統開發人員的“瓶頸”問題。誠然,軟件的設計模式直接決定了軟件的安全和可靠性。文中介紹了一種基于模型的可靠性軟件開發平臺方案。大量的工程應用也表明該方法是切實有效的。
何謂“高可靠性軟件”?1983年美國IEEE計算機學會軟件工程技術委員會將軟件可靠性定義如下[1]:在規定的條件下,在規定的時間內,軟件不引起系統失效的概率。在規定的時間周期內和條件下,程序執行要求的功能的能力。這個標準隨后經美國標準化研究院批準作為美國的國家標準,1989年我國國標GB/T-11457采用了這個定義。
那么,如何開發“高可靠性軟件”?軟件可靠性工程的任務是力爭在軟件生命周期過程中最大限度地減少軟件產品中的缺陷。而減少軟件缺陷必須在全面周密的考慮系統在各個不同階段、不同狀態下,保證軟件和需求的一致性。
目前,大多數嵌入式軟件項目都采用“以手工編碼和以代碼為中心”瀑布模型作為規范化開發的基礎。該種開發方式以代碼開發為中心,需求分析、軟件設計為軟件編碼做準備,代碼編寫完成后進行單元測試。長期以來,代碼編寫一直是開發過程的主要階段,占用了大量的時間和人力。隨著人們對軟件質量的重視,單元測試在開發過程中的地位日益重要,在目前的開發流程中,越來越多的力量投入到代碼的單元測試中[2]。
基于代碼開發方式的缺點非常明顯:
1)開發效率低下
由于代碼的抽象程度高,不直觀,與軟件需求完全脫節,因此開發人員不得不花大量的時間在技術細節上,代碼的修改也很耗時。
2)質量沒有保證
由于軟件代碼由程序員手工編寫,程序員的能力、態度及狀態制約了軟件的質量。且隨著軟件規模、復雜度的不斷增加,團隊開發情況的出現,代碼集成也變得越來越難。
出現這些缺點的主要原因在于,在基于代碼開發方式下,開發工作的早期(需求分析、軟件設計)完全依賴于人工工作,其成果以有歧義的自然語言或圖表方式描述,無法進行有效的交流和驗證,從而成為錯誤引入的重災區;而當具有動態行為的代碼出現后,對代碼的測試是一種事后監督的、費時費力的做法,只能盡可能地發現錯誤,而無法有效地避免或者是排除錯誤。
隨著人們對軟件認識的逐漸加深及實踐中的探索,模型取代代碼成為了軟件開發流程的中心。直觀的模型符號被用于需求分析及以軟件設計過程,表達分析人員對需求的理解及細化。由于模型遠比程序語言的抽象程度低,更易于理解和交流,減少了需求分析和軟件設計過程中錯誤引入的機率,尤為重要的是,模型還可用于模擬仿真,表達其動態特性,從而使開發人員在開發的早期能確定性地發現并排除錯誤。
一般來說,基于模型的開發方式具有以下特征:
1)形式化的圖形符號
直觀易懂的圖形符號是模型的主要特征,也是模型優于代碼的主要原因。借助于圖形化的符號組成的模型,閱讀者不僅能快速獲取模型所表達的含義,而且不會因知識背景的不同產生歧義。
2)模型可運行
可運行的模型為開發人員了解模型的動態行為提供了方便,可以驗證設計與需求是否一致。
所謂“基于模型”,是以一種形式化的模型方式描述一個系統或是一個子系統[3]。一個模型可以是數學意義上的,由一系列關于系統的聲明構成;也可以是構架意義上的(又稱作可執行的),用來描述一個系統對系統外激勵的響應情況。
隨著計算機技術的迅猛發展和軟件工程自動化的不斷發展,“基于模型”的開發工具不斷涌現,這類工具的普遍特點是通過形式化的建模方式實現需求、模型可以直接進行模擬、并且可以直接將模型轉化為源代碼。
基于模型的開發工具有很多,在嵌入式軟件開發領域應用比較廣泛的主要有基于UML的建模工具,或是結構化的設計工具(SCADE、SIMULINK 等)。
1)基于UML的設計工具:關注于高層的功能劃分、結構分解、行為規范和需求分析,適合于系統建模;它從軟件工程的角度對開發流程進行規范,但很少考慮高可靠性嵌入式軟件開發的特點,軟件工程自動化程度較低,生成的只是一個代碼框架,需要對它生成的代碼做大量的修改和補充之后才能使用。
2)Simulink:面向仿真,仿真功能比較強大,支持對硬件和外界環境的模擬,可以進行全局的仿真和調試;但是由于底層缺乏數學理論的支撐,無法保證模型作為需求描述的無歧義性;從生成代碼的角度來說,它生成的代碼也需要做大量的修改和補充之后才能使用,而這種做法在增加工作量的同時,和基于UML的設計工具一樣,帶來了一個潛在的很復雜的開發流程管理和質量認證上的問題。
3)SCADE (Safety-Critical Application Development Environment)是一套基于模型的、面向高可靠性軟件而設計的開發環境,具有嚴格的理論基礎支持,充分考慮了高可靠性軟件開發中的質量、安全特性、開發周期、認證等各方面的問題,國內外高安全性嵌入式領域應用經驗表明,它非常適合用于開發高可靠性軟件。
SCADE[6](Safety-Critical Application Development Environment)是一套高安全性嵌入式軟件開發環境,運用Correct By Construction[5]的設計理念,能夠從精確的需求規范自動生成嵌入式源代碼,實現了開發流程的高度自動化。它涵蓋了嵌入式軟件開發的整個流程:需求管理、需求建模、模型檢查、模型仿真、模型覆蓋率分析、形式驗證、代碼生成、文檔生成等等。SCADE適用于不同軟、硬件平臺,是一套通用的嵌入式軟件開發平臺。
在現有的瀑布式的開發流程中,軟件需求、概要設計、詳細設計都是為了編碼;單元測試、集成測試、系統測試都是為了驗證代碼的正確性,代碼是整個工作的重心。使用了SCADE之后,整個設計流程是圍繞著SCADE模型展開的:概要設計和詳細設計的過程其實都是用SCADE建模的過程,并且提供了一系列驗證手段保證了模型的正確性和安全性,SCADE模型成為整個開發工作的核心,工作的重心從原先的代碼提高到了模型的級別。

圖1 基于SCADE的嵌入式軟件開發平臺Fig.1 Structure of embedded software development platform with SCADE
1)設計過程
SCADE提供了兩套機制(數據流圖和安全狀態機)來進行圖形化建模。數據流圖適合于連續系統圖建模,安全狀態機適用于離散系統的建模。SCADE將這兩套建模機制很好地融合在一起,能夠適用于不同類型系統尤其是混合系統的開發。
這兩套機制都建立在嚴格的數學模型基礎之上,具有嚴格的數學語義,它們保證了設計模型的精確性、完整性、一致性和無二義性。由于該描述是形式化的,因此建模的過程也是描述需求的過程,得到的是明確無歧義的軟件需求。
2)設計過程的驗證
SCADE提供了一系列的驗證機制,來確保軟件需求模型描述的正確性和安全性:
①模型靜態檢查
建立好了需求模型之后,可以對模型進行自動檢查,幫助找出模型中的數據流不匹配、死循環等一系列語義和方法學方面的錯誤,并提供超鏈接進行錯誤定位。
②模擬仿真
模型通過靜態檢查之后,可以通過SCADE提供的模型仿真器,對整個系統或是系統中任意一個模塊進行模擬仿真。該仿真器是一套功能強大的可視化的調試環境,可以設置斷言、斷點;可以檢查輸入數據、局部變量和輸出數據的值;可以用文本或圖表的形式記錄仿真過程中各輸入輸出的值;可以保存和回放仿真的場景(scenario)。最重要的一點也是區別其他基于模型開發工具的最重要的一點:SCADE保證仿真結果和生成代碼運行的結果是一致的。
③覆蓋率分析
模擬仿真是對模型進行功能測試的過程。為了評估模型測試的完備性,SCADE提供了基于模型的覆蓋率分析。根據既定的或者自定義的覆蓋率準則,分析仿真場景在模型中的覆蓋程度,并能指明未覆蓋的路徑;隨后用戶對覆蓋率進行分析,找出測試用例的不足、需求設計錯誤、死代碼等問題,用于指導設計模型改進、需求改進等。最后,SCADE還能自動生成覆蓋率分析的報告。
④形式驗證
模擬仿真能夠測試系統模型是否實現了預期功能,但并不能保證系統在所有情況下都滿足安全特征。由于測試的局限性,難以通過測試來驗證安全特性,對于復雜的邏輯控制系統來說尤是如此。SCADE所提供的形式驗證[4]彌補了這一局限性。
3)自動生成代碼
經過模擬仿真、覆蓋率分析和形式驗證,保證了模型的正確性和安全性以后,可以利用SCADE內置的代碼生成器KCG自動生成嵌入式產品代碼。它生成的代碼滿足一系列的安全特性,有良好的可讀性和接口,具有和手寫代碼相當的大小和效率。該代碼生成器通過了軍工及航空業及能源業相關標準的鑒定[5],因此,使用SCADE之后,不僅大大節省了編碼工作,而且完全免去了代碼的單元測試和對于單元測試的驗證 (即代碼覆蓋率分析),很大程度地節省了驗證工作和驗證時間。
4)集成階段的驗證
當得到源代碼之后,根據硬件平臺使用編譯器 (如:Tornado,GCC等)將源代碼編譯為目標代碼。高可靠性的軟件開發流程不僅需要對源代碼進行分析,還需要保證從源代碼到目標代碼的一致性。SCADE提供了CVK(Complier Verify Kit)工具包,能夠輔助驗證編譯器能否正確地將KCG生成的代碼編譯成目標碼。
5)開發流程管理
作為一個面向高可靠性軟件而設計的開發環境,SCADE在保證了嵌入式軟件的可靠性的前提之下,并通過和其他一些工具的配合保證了整個開發流程的生命周期數據管理。
①通過SCADE RM實現了開發過程中數據的可追溯性管理;
②通過SCC接口實現了開發過程中配置管理,由于SCADE以ASCII格式保存所有數據,并支持標準的配置管理界面。因此,可以方便的與市面上所有的配置管理工具建立橋接。
綜上所述,SCADE采用 “基于模型”的開發流程代替了“基于代碼”的開發流程,設計的結果是SCADE模型而不是代碼,從軟件開發重點從編碼階段提升到了設計階段;同時,不再通過對測試、或是無法定量衡量的評審來保證軟件的高可靠性,而是通過對整個開發流程有效的管理來保證軟件的高可靠性。
文中詳細介紹了以SCADE為核心的軟件開發平臺,采用該平臺進行高可靠性軟件開發,克服了傳統的以手工編碼為核心的開發流程的不足,將軟件開發重點由編碼階段提前到設計階段,可以顯著縮短軟件開發周期,降低開發成本,提高開發效率。更為重要的是,傳統軟件開發流程中的設計流程的驗證工作主要以手工方式進行,驗證的驗證工作難以實現,而在以SCADE為核心的開發平臺中,可以通過模型測試的方式進行需求驗證,該驗證進程可通過模型覆蓋率分析進行驗證;傳統軟件開發過程中的單元測試工作在該開發平臺中可以省略。目前,該開發平臺已經在航空軌道交通等多個高安全性的嵌入式軟件開發方面得到廣泛應用。作者將在后續文章中以具體案例對該開發平臺作進一步闡述。
[1]宋彬,沈懷容.航天產品單元可靠性評估軟件研究[J].裝備指揮技術學院學報,2002,12(4):54-57 SONG Bin,SEHN Huai-rong.Research on reliability evaluation software for spaceflight items[J].Equipment Command Cechnical College Journals,2001,12(4):54-57.
[2]石柱,何新貴.航天型號軟件生存周期模型選擇指南[J].計算機工程與設計,2000,21(6):43-47.SHI Zhu,HE Xin-gui.Guidelines on selecting an appropriate software Life-cycle model for a specific aerospace software project[J].Computer Engineering and Design,2000,21(6):43-47.
[3]楊麗莎,王慧.基于模型的嵌入式軟件設計[J].計算機應用研究,2004,21(12):76-78.YANG Li-sha,WANG Hui.Model-based design of embedded software[J].Application Research of Computers,2004,21(12):76-78.
[4]林楓.基于SCADE的形式化驗證技術研究[J].測控技術,2011,30(12):71-74.LIN Feng.Research on SCADE-Based formal verification technology[J].Measurement and Control Technology,2011,30(12):71-74.
[5]Jean-Louis Camus,Bernard Dion.Efficient development of airborne software with SCADE suite[M].Esterel Technologies,2011.
[6]Berry G.The Constructive Semantics of Pure Esterel Draft V3[M].Esterel Technologies,2009.