摘要
軟件故障注入是功能安全驗(yàn)證的重要技術(shù)手段。本文旨在為軟件故障注入提供一個(gè)基本概述,以及簡(jiǎn)介現(xiàn)有的故障注入技術(shù)。
01
故障注入方法簡(jiǎn)介
在功能安全相關(guān)關(guān)鍵場(chǎng)景中,密集的測(cè)試活動(dòng)對(duì)于確保新系統(tǒng)和內(nèi)置容錯(cuò)機(jī)制按預(yù)期運(yùn)行至關(guān)重要。確保系統(tǒng)在出現(xiàn)故障時(shí)正常運(yùn)行(Fail Operational)是一個(gè)需要比傳統(tǒng)測(cè)試內(nèi)容復(fù)雜的問題。在系統(tǒng)中引入故障以評(píng)估其行為并測(cè)量容錯(cuò)機(jī)制的效率(即覆蓋率和延遲)的過程稱為故障注入。
故障注入方法的發(fā)展是隨著數(shù)字化的發(fā)展同步進(jìn)行的。
最開始,數(shù)字系統(tǒng)只使用了簡(jiǎn)單的硬件系統(tǒng)。因此,第一種故障注入方法包括通過假設(shè)簡(jiǎn)單的硬件故障模型(如位翻轉(zhuǎn)或位卡死)將物理故障注入目標(biāo)系統(tǒng)硬件(例如,使用輻射、引腳電平、電源干擾等)。
硬件的日益復(fù)雜使這些物理方法的使用變得相當(dāng)困難,甚至不可能,一個(gè)新的故障注入方法,即基于通過軟件(軟件實(shí)現(xiàn)的故障注入SWIFI)對(duì)硬件故障進(jìn)行運(yùn)行時(shí)仿真,變得非常流行。
隨著關(guān)鍵系統(tǒng)在其他應(yīng)用領(lǐng)域的擴(kuò)展,我們看到這些系統(tǒng)的軟件部分越來越復(fù)雜,這成為系統(tǒng)故障的一個(gè)不可忽視的原因。阿麗亞娜5號(hào)火箭的第一次試飛(1996年6月4日)就是一個(gè)例子。在試飛過程中,火箭偏離了飛行路線,在起飛后不到一分鐘就發(fā)生了爆炸,造成了5億美元的損失。爆炸是由軟件中的錯(cuò)誤數(shù)據(jù)轉(zhuǎn)換引起的,從64位浮點(diǎn)到16位有符號(hào)整數(shù)表示。該漏洞源于對(duì)以往任務(wù)中軟件子系統(tǒng)的重用,而沒有進(jìn)行實(shí)質(zhì)性的重新測(cè)試,開發(fā)人員認(rèn)為該任務(wù)與新系統(tǒng)兼容。
SWIFI工具用于在程序狀態(tài)(例如,數(shù)據(jù)和地址寄存器、堆棧和堆內(nèi)存)和程序代碼(例如,在程序執(zhí)行之前或期間存儲(chǔ)代碼的內(nèi)存區(qū)域)中注入錯(cuò)誤。不幸的是,在復(fù)雜的軟件密集型系統(tǒng)中,通過SWIFI無法準(zhǔn)確模擬真實(shí)軟件故障的影響。因?yàn)樵谶^去三十年中,汽車中使用的代碼行的規(guī)模從數(shù)萬行呈指數(shù)增長到數(shù)億行。
與第一種故障注入方法相比,使用故障注入來模擬真實(shí)軟件故障(即bug)的影響,即軟件故障注入(SFI),是相對(duì)較新的方法。實(shí)際上,軟件故障的注入包括在目標(biāo)程序代碼中引入小的更改,創(chuàng)建不同版本的程序(每個(gè)版本有一個(gè)注入的軟件故障)。
ISO 26262標(biāo)準(zhǔn)規(guī)定了軟件中錯(cuò)誤檢測(cè)和處理機(jī)制的使用,以及通過故障注入進(jìn)行驗(yàn)證。
軟件故障注入是一種假設(shè)實(shí)驗(yàn),它可能起源于軟件開發(fā)過程的任何階段,包括需求分析、設(shè)計(jì)和編碼活動(dòng)。在給定的工作負(fù)載下執(zhí)行目標(biāo),并將故障插入目標(biāo)系統(tǒng)的特定軟件組件中。主要目標(biāo)是觀察系統(tǒng)在存在注入故障的情況下的行為,考慮到這些故障會(huì)重現(xiàn)可能在運(yùn)行期間影響系統(tǒng)給定軟件組件的合理故障。
02
故障注入方法關(guān)鍵特性
//
故障是系統(tǒng)狀態(tài)不正確的判定或假設(shè)的原因,稱為錯(cuò)誤。故障是在提供錯(cuò)誤服務(wù)時(shí)發(fā)生的事件,即用戶或外部系統(tǒng)感知到錯(cuò)誤狀態(tài)。
故障注入活動(dòng)獲得的結(jié)果的準(zhǔn)確性在很大程度上取決于實(shí)驗(yàn)的幾個(gè)關(guān)鍵特性,即:
代表性
是指故障負(fù)載和工作負(fù)載代表系統(tǒng)在運(yùn)行期間將經(jīng)歷的真實(shí)故障和輸入的能力。通過定義一個(gè)真實(shí)的故障模型,并在實(shí)驗(yàn)過程中準(zhǔn)確再現(xiàn)該故障模型,可以實(shí)現(xiàn)故障的代表性。
非侵入性
要求故障注入過程中采用的儀器(如故障插入和數(shù)據(jù)收集)不應(yīng)顯著改變實(shí)際系統(tǒng)的行為。例如,執(zhí)行額外的代碼來破壞軟件狀態(tài)可能會(huì)導(dǎo)致侵入。
重復(fù)性
是指當(dāng)在同一環(huán)境中使用同一程序多次執(zhí)行故障注入活動(dòng)時(shí),可確保統(tǒng)計(jì)結(jié)果等效的特性。由于計(jì)算機(jī)系統(tǒng)中存在許多不確定性的來源,例如線程調(diào)度和事件計(jì)時(shí),要實(shí)現(xiàn)這一特性并非易事。
實(shí)用性
是指故障注入在成本和時(shí)間方面的有效性。這些因素包括實(shí)現(xiàn)和設(shè)置故障注入環(huán)境所需的時(shí)間、執(zhí)行實(shí)驗(yàn)的時(shí)間以及分析結(jié)果的時(shí)間。該屬性要求實(shí)驗(yàn)由自動(dòng)工具支持,以滿足時(shí)間和預(yù)算限制。
可移植性
要求故障注入技術(shù)或工具能夠輕松地應(yīng)用于不同的系統(tǒng),以便進(jìn)行比較。故障注入工具的可移植性還指該工具支持多個(gè)故障模型并用新的故障模型進(jìn)行擴(kuò)展的能力。
03
軟件故障特征
軟件故障的注入需要對(duì)要注入的故障進(jìn)行精確定義,這反過來又需要對(duì)軟件故障進(jìn)行清晰的理解和描述。這并不容易實(shí)現(xiàn),因?yàn)檐浖收鲜怯捎陂_發(fā)過程中發(fā)生的人為錯(cuò)誤造成的,這些錯(cuò)誤會(huì)以程序中錯(cuò)誤指令的形式影響軟件工件。
為了提高軟件可靠性,人們提出了幾種故障分類模式。在故障分類模式中,正交缺陷分類(Orthogonal Defect classification,ODC)是研究人員和實(shí)踐者最廣泛采用的模式之一,并已在多個(gè)研究中用于定義軟件故障注入的故障模型。ODC是一個(gè)對(duì)軟件故障進(jìn)行分類的框架,目的是獲得軟件開發(fā)過程的度量和定量反饋;
04
軟件故障注入技術(shù)
//
許多SFI技術(shù)和工具是在20多年的時(shí)間里發(fā)展起來的。這里,我們通過區(qū)分兩種基本方法來說明和討論這些工作:注入故障效應(yīng)(也稱為錯(cuò)誤注入),其中通過擾動(dòng)系統(tǒng)狀態(tài)引入錯(cuò)誤,以及注入實(shí)際故障,其中更改程序代碼以模擬代碼中的軟件故障。以下小節(jié)分別回顧了軟件故障注入技術(shù):
· 數(shù)據(jù)錯(cuò)誤注入的方法最早,這些方法基于當(dāng)時(shí)存在的硬件故障注入技術(shù);
· 接口錯(cuò)誤注入方法,旨在測(cè)試組件與其他組件交互的穩(wěn)健性;
·注入實(shí)際故障的方法,在程序代碼中引入小的故障更改。
4.1數(shù)據(jù)錯(cuò)誤注入
早期注入故障效應(yīng)的方法是在通過SWIFI研究硬件故障的背景下發(fā)展起來的。SWIFI旨在通過軟件干擾內(nèi)存或硬件寄存器的狀態(tài),再現(xiàn)硬件故障(如CPU、總線和內(nèi)存故障)的影響(即錯(cuò)誤)。根據(jù)以下標(biāo)準(zhǔn),SWIFI方法將內(nèi)存位置或寄存器的內(nèi)容替換為損壞的值:
· 注入什么。內(nèi)存位置或寄存器中單個(gè)位、字節(jié)或字的內(nèi)容已損壞。通過對(duì)電氣或門級(jí)故障產(chǎn)生的錯(cuò)誤的分析,定義了錯(cuò)誤類型。常見的錯(cuò)誤類型是用固定值(卡在0和卡在1故障)或相反值(位翻轉(zhuǎn))替換位。
· 注入的地方。由于內(nèi)存位置眾多,注入內(nèi)存的錯(cuò)誤通常針對(duì)位置的子集。注入可以集中在特定內(nèi)存區(qū)域中隨機(jī)選擇的位置(例如堆棧、堆、全局?jǐn)?shù)據(jù))或用戶選擇的位置(例如內(nèi)存中的特定變量)。在寄存器中注入的錯(cuò)誤可以針對(duì)那些可以通過軟件訪問的寄存器(例如,數(shù)據(jù)和地址寄存器)。
· 何時(shí)注入。錯(cuò)誤注入可能與時(shí)間或事件有關(guān)。在前一種情況下,在經(jīng)過給定的實(shí)驗(yàn)時(shí)間后注入錯(cuò)誤,該時(shí)間由用戶或根據(jù)概率分布選擇。在后一種情況下,當(dāng)特定事件在執(zhí)行期間發(fā)生時(shí),例如在第一次訪問或每次訪問目標(biāo)位置時(shí),會(huì)注入錯(cuò)誤??梢阅M三種類型的硬件故障,分別是瞬時(shí)故障(即偶然故障)、間歇性故障(即多次重復(fù)故障)和永久性故障。
值得注意的是,SWIFI工具注入的硬件錯(cuò)誤可以在程序狀態(tài)(例如,數(shù)據(jù)和地址寄存器、堆棧和堆內(nèi)存)和程序代碼(例如,在程序執(zhí)行之前或執(zhí)行期間存儲(chǔ)代碼的內(nèi)存區(qū)域)中注入。這是軟件故障注入的一個(gè)重要區(qū)別:程序狀態(tài)中的損壞旨在反映軟件故障的影響,即錯(cuò)誤程序的執(zhí)行導(dǎo)致的錯(cuò)誤,例如錯(cuò)誤的指針、標(biāo)志或控制流,SWIFI工具可以直接引入此類錯(cuò)誤;相反,程序代碼中的故障旨在反映代碼中的實(shí)際軟件故障。
4.2 接口錯(cuò)誤的注入
在輸入參數(shù)處注入錯(cuò)誤旨在模擬目標(biāo)外部故障產(chǎn)生的影響,包括外部軟件組件中軟件故障的影響,并評(píng)估目標(biāo)檢測(cè)和處理損壞輸入的能力。以類似的方式,輸出值的損壞被用來模擬故障部件的輸出,并可用于評(píng)估故障對(duì)系統(tǒng)其余部分的影響。
輸入?yún)?shù)的故障可能會(huì)揭示目標(biāo)的錯(cuò)誤檢測(cè)和恢復(fù)機(jī)制(例如,輸入處理代碼)的設(shè)計(jì)和實(shí)施中的缺陷。它通常在穩(wěn)健性測(cè)試中采用,該測(cè)試評(píng)估“系統(tǒng)或組件在存在無效輸入或壓力環(huán)境條件下能夠正確運(yùn)行的程度”。應(yīng)該注意的是,健壯性測(cè)試和接口錯(cuò)誤注入的目標(biāo)不同于功能測(cè)試技術(shù),例如黑盒測(cè)試:健壯性測(cè)試旨在評(píng)估軟件模塊在面對(duì)無效輸入時(shí)的健壯行為(例如,避免了進(jìn)程崩潰,或產(chǎn)生了警告信號(hào)),它與目標(biāo)的功能正確性無關(guān)。
接口錯(cuò)誤注入可以通過兩種方式執(zhí)行。第一種方法基于鏈接到目標(biāo)組件的測(cè)試驅(qū)動(dòng)程序(例如,使用目標(biāo)導(dǎo)出的API的程序),并通過提交無效輸入來執(zhí)行該程序。這種方法類似于單元測(cè)試,但在這種情況下,評(píng)估的是健壯性,而不是功能正確性。第二種方法包括攔截和破壞目標(biāo)與系統(tǒng)其余部分之間的交互,即在調(diào)用目標(biāo)組件時(shí)觸發(fā)攔截器程序,并修改原始輸入以引入損壞的輸入。在這種情況下,目標(biāo)組件將在集成目標(biāo)的整個(gè)系統(tǒng)的上下文中進(jìn)行測(cè)試。這種方法類似于SWIFI,因?yàn)榱鹘?jīng)系統(tǒng)的原始數(shù)據(jù)(在本例中為接口輸入)被損壞的數(shù)據(jù)替換。
在接口錯(cuò)誤注入實(shí)驗(yàn)中,在實(shí)驗(yàn)期間發(fā)生的幾個(gè)輸入?yún)?shù)和目標(biāo)API的幾個(gè)調(diào)用中,通常只有一個(gè)輸入?yún)?shù)和一個(gè)調(diào)用被破壞。生成無效輸入值的常用方法有三種:
· 模糊化:原始值被隨機(jī)生成的值替換。
· 位翻轉(zhuǎn):通過反轉(zhuǎn)原始值的一個(gè)或多個(gè)位的值來生成損壞的值。
· 基于數(shù)據(jù)類型的注入:原始值被替換為無效值,該值是根據(jù)被破壞的輸入?yún)?shù)類型選擇的,其中類型是從目標(biāo)導(dǎo)出的API派生的。這種方法為每種數(shù)據(jù)類型定義了一個(gè)無效值池,這些值是從類型域的分析中選擇的(例如,在C指針的情況下為“NULL”)。
4.3注入代碼的更改
前面小節(jié)討論的主要是通過使用SWIFI方法注入故障影響(即錯(cuò)誤)來模擬軟件故障。這些方法的一個(gè)公開問題是注入錯(cuò)誤(如位翻轉(zhuǎn))的代表性,它不一定與軟件故障產(chǎn)生的錯(cuò)誤匹配。
為了解決代表性問題,最近對(duì)SFI的研究集中在程序代碼中錯(cuò)誤的注入(即代碼更改)。即可以采用注入代碼更改來模擬真實(shí)軟件故障,因?yàn)樽⑷氲墓收蠒?huì)產(chǎn)生與真實(shí)軟件故障產(chǎn)生的錯(cuò)誤和故障相似的錯(cuò)誤和故障。一般可通過在進(jìn)程的代碼存儲(chǔ)區(qū)或二進(jìn)制可執(zhí)行文件上應(yīng)用SWIFI,在程序中注入錯(cuò)誤。但要注意通過對(duì)這些程序進(jìn)行徹底測(cè)試,需在有限的范圍內(nèi)注入軟件故障,需要專門針對(duì)軟件故障注入的工具和技術(shù)。
05
結(jié)論
//
在為系統(tǒng)選擇方法時(shí),應(yīng)考慮所討論的故障注入方法的特點(diǎn)。
錯(cuò)誤注入通常用于評(píng)估單個(gè)組件的健壯性,并改進(jìn)代碼特定部分的錯(cuò)誤處理。主要原因是,錯(cuò)誤的注入允許對(duì)系統(tǒng)的特定部分進(jìn)行實(shí)驗(yàn),因?yàn)樗梢栽u(píng)估錯(cuò)誤對(duì)特定組件接口或程序變量的影響。事實(shí)上,錯(cuò)誤注入不需要等待錯(cuò)誤生成并傳播到正在評(píng)估的程序狀態(tài)的特定部分。此外,由于錯(cuò)誤注入可以應(yīng)用于單個(gè)組件,因此可以在軟件驗(yàn)證的早期階段執(zhí)行。
相反,注入代碼更改的目的是作為一個(gè)整體評(píng)估容錯(cuò)系統(tǒng),并在備選設(shè)計(jì)選擇之間進(jìn)行定量評(píng)估和比較。代碼更改更適合于這些目標(biāo),因?yàn)樗鼈兓谲浖收系拇硇阅P?,并密切模擬故障軟件的行為。這是定量評(píng)估和比較的一個(gè)重要要求,因?yàn)樗鼈兛紤]了故障發(fā)生的相對(duì)概率,以反映系統(tǒng)在運(yùn)行期間表現(xiàn)出的行為。這使得代碼更改的注入更適合于軟件驗(yàn)證的后期階段,此時(shí)系統(tǒng)組件已經(jīng)集成,開發(fā)人員的目標(biāo)是評(píng)估系統(tǒng)在其運(yùn)行壽命期間的預(yù)期容錯(cuò)性(以及衍生的度量,如可用性)。
作者:鄭威,TüV北德功能安全總監(jiān)
編輯:黃飛
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211576 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3019瀏覽量
74003 -
驅(qū)動(dòng)程序
+關(guān)注
關(guān)注
19文章
831瀏覽量
48022 -
硬件系統(tǒng)
+關(guān)注
關(guān)注
0文章
48瀏覽量
11364
原文標(biāo)題:軟件故障注入方法
文章出處:【微信號(hào):談思實(shí)驗(yàn)室,微信公眾號(hào):談思實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論