馮濟舟劉洪喜
(1.中國電子科技集團第三十八研究所,安徽 合肥 230088;2.空裝駐安徽地區(qū)軍事代表室,安徽 合肥 230088)
軟件測試典型案例的研究及思考
馮濟舟1劉洪喜2
(1.中國電子科技集團第三十八研究所,安徽 合肥 230088;2.空裝駐安徽地區(qū)軍事代表室,安徽 合肥 230088)
軟件測試是軟件能力成熟度模型集成的重要活動,通過對軟件測試典型問題的分析和研究,提出了解決方法,對軟件質(zhì)量的提升具有實際意義。
軟件測試;軟件能力成熟度模型集成;解決方法
軟件測試作為能力成熟度模型集成(CMMI,Capability Maturity Model Integration)驗證(Ver,Verifcation)和確認(Val,Validation)過程域的重要實現(xiàn)手段,是軟件生命周期模型中的重要階段,是保證軟件質(zhì)量的重要途徑 。近年來,隨著軟件規(guī)模和復雜程度的不斷提高,軟件測試的難度也不斷加大。
本文根據(jù)實際工程經(jīng)驗,總結(jié)出軟件測試過程中遇到的典型問題,并通過對這些問題的闡述和分析,提出了預防此類問題發(fā)生的解決方法,對提高軟件質(zhì)量具有積極意義。
1.1 接口報文中總匯信息數(shù)量字段判斷不合理導致系統(tǒng)崩潰
1.1.1 場景復現(xiàn)
軟件配置項間傳遞消息的接口報文中含有匯總下文信息數(shù)量的字段,且該字段的報文下文以枚舉方式列舉出匯總信息數(shù)量個數(shù)的數(shù)組結(jié)構(gòu)元素內(nèi)容信息,其報文結(jié)構(gòu)如表1所示。對于將此種類型報文作為輸入的被測軟件,出于安全性方面的考慮,應進行對異常條件下軟件的處理和保護能力的測試,以表明不會因為可能的單個輸入錯誤而導致不安全狀態(tài)。當接口報文中匯總下文信息數(shù)量字段設(shè)置為極大值后會導致被測軟件系統(tǒng)的崩潰。
1.1.2 問題分析
在被測軟件系統(tǒng)的讀取過程中,當指針讀取到報文如表1所示的“數(shù)組結(jié)構(gòu)數(shù)量統(tǒng)計”字段時,系統(tǒng)會按照這一字段的數(shù)值大小在本地計算機內(nèi)存中開辟動態(tài)空間用于存儲報文下文中以“數(shù)組結(jié)構(gòu)數(shù)量統(tǒng)計”字段值為個數(shù)的數(shù)組結(jié)構(gòu)元素內(nèi)容信息。假設(shè)在此字段讀取過程中不加限制和判斷,那么對于此讀取過程來說,系統(tǒng)最大可以申請字節(jié)容量的內(nèi)存空間,當程序申請的動態(tài)內(nèi)存超過實際物理內(nèi)存擁有的空間時,會導致系統(tǒng)崩潰。
表1 含有匯總下文信息數(shù)量字段的接口格式
1.1.3 風險控制方法
對于被測軟件接收處理含有匯總下文信息數(shù)量字段的接口報文時,在對匯總下文信息數(shù)量字段數(shù)據(jù)進行讀取時,要對此字段值進行判斷和限制,以防止由于匯總下文信息數(shù)量字段值過大,引起系統(tǒng)崩潰。
1.2 幀頭判斷不合理導致數(shù)據(jù)丟幀
1.2.1 場景復現(xiàn)
通訊模塊處理數(shù)據(jù)時按照通訊協(xié)議的內(nèi)容首先對信息頭的有效性進行判斷,當且僅當報頭為有效信息頭后才繼續(xù)接收后續(xù)數(shù)據(jù),否則數(shù)據(jù)舍棄。程序設(shè)計時設(shè)置的通訊協(xié)議格式如圖1所示,其中X Y表示信息頭,省略號部分表示信息正文。在對此信息格式進行接口測試的過程中,采用猜錯法測試被測軟件,當接收到如圖2所示信息格式異常的接口輸入時,被測軟件未能對X后具有正確格式的X Y+正常信息正文的信息進行解析處理。即在此情況下被測軟件不能判斷出正常數(shù)據(jù)信息,造成軟件丟包現(xiàn)象。
1.2.2 問題分析
出現(xiàn)此現(xiàn)象的原因是程序在對信息頭判斷方式不合理而造成的,導致當程序接收到數(shù)據(jù)X X Y+正常信息正文時,會誤把真正信息頭的X當作是第一個信息頭X的一部分,即將信息頭識別成X X,并按照判斷有效信息頭的原則,將此有信息頭問題的信息進行舍棄,從而導致被測軟件接收不到正常數(shù)據(jù),出現(xiàn)丟信息現(xiàn)象。
圖1 正常通訊協(xié)議格式
圖2 信息頭異常的通訊協(xié)議格式
1.2.3 風險控制方法
在進行信息頭協(xié)議判斷時,應采用滑動窗口判斷方法,如在處理信息格式為X Y+正常信息正文的協(xié)議時,如果判斷信息頭是X,而第二個信息頭不是Y,則應重新判斷下一個為X的字節(jié),以免丟掉類似X X Y+正常信息正文的合法信息。
1.3 未考慮范圍邊界導致系統(tǒng)崩潰
1.3.1 場景復現(xiàn)
被測軟件某功能運行的有效輸入范圍為(-1500,0)和(0,1500),但在對此功能的合法邊界值和非法邊界值進行輸入時發(fā)現(xiàn),當輸入非法邊界值為0時,軟件系統(tǒng)崩潰;當輸入非法邊界值為-1500或1500時,程序計算出錯。
1.3.2 分析及思考
程序在進行功能的有效邊界值判斷時,未明確有效輸入范圍的開區(qū)間、閉區(qū)間以及特殊值,導致軟件系統(tǒng)崩潰及處理結(jié)果錯誤。
1.3.3 風險控制方法
在對功能的有效輸入范圍進行開發(fā)實現(xiàn)時,要嚴格按照軟件需求規(guī)格說明中的規(guī)定,對邊界值進行有效性判斷,以防止非法邊界值在參與程序計算過程中產(chǎn)生諸如除數(shù)為0、負數(shù)取對數(shù)等導致系統(tǒng)崩潰的結(jié)果。
1.4 迷途指針導致系統(tǒng)崩潰
1.4.1 場景復現(xiàn)
軟件某功能模塊源代碼中存在所指向的對象被釋放或者收回后,未對該指針做任何修改,以至于該指針仍舊指向已經(jīng)回收的內(nèi)存地址,當程序再次直接引用該指針時,導致軟件系統(tǒng)崩潰。
1.4.2 分析及思考
本案例涉及的問題是軟件開發(fā)中很難發(fā)現(xiàn)的一種錯誤,即迷途指針。當所指向的對象被釋放或者收回后,如果未對該指針做任何修改,則該指針仍舊指向已經(jīng)回收的內(nèi)存地址,當操作系統(tǒng)將這部分已釋放的內(nèi)存重新分配給其它進程,而原來的程序又要重新引用現(xiàn)在的迷途指針時,將產(chǎn)生無法預料的后果。通常來說,若原來的程序繼續(xù)往迷途指針所指向的內(nèi)存地址寫入數(shù)據(jù),將破壞操作系統(tǒng)所分配的在此內(nèi)存空間中存儲數(shù)據(jù)的其他進程,進而導致不可預料的程序錯誤。這種類型的程序錯誤不容易找到問題的原因,通常會導致Linux系統(tǒng)的段錯誤和Windows系統(tǒng)的保護錯誤。如果操作系統(tǒng)的內(nèi)存分配器將已經(jīng)被覆蓋的數(shù)據(jù)區(qū)域再分配,就可能影響系統(tǒng)的穩(wěn)定性。
1.4.3 風險控制方法
在編碼過程中,謹記指針指向的內(nèi)存空間一旦被釋放,就立即把該指針置為空指針的編程原則。因為當空指針被重新引用時,程序會立即停止,這樣可以避免數(shù)據(jù)損壞或者出現(xiàn)某些無法預料的后果。
通過代碼審查的方式在早期可以診斷程序的迷途指針問題。可以借助代碼審查工具在軟件實現(xiàn)完成之后或確認測試開展之前對編寫的源代碼進行代碼審查,以發(fā)現(xiàn)與程序相關(guān)的可追溯性方面、邏輯方面、數(shù)據(jù)方面、計算方面、比較方面、接口方面、注釋方面、輸入/輸出方面以及內(nèi)存方面的軟件代碼錯誤、缺陷和隱患,從而排除如迷途指針錯誤的軟件問題。
1.5 加密數(shù)據(jù)庫文件的安全問題
1.5.1 場景復現(xiàn)
出于對軟件系統(tǒng)安全方面的考慮,在對軟件系統(tǒng)進行某些操作之前,要先完成相應操作的訪問控制權(quán)限的驗證,使用者只有通過訪問控制權(quán)限的驗證,才能對軟件系統(tǒng)相應授權(quán)范圍內(nèi)容進行操作。訪問控制權(quán)限的驗證信息存儲于97版本ACCESS數(shù)據(jù)庫的加密MDB(Microsoft Database)文件中。但在對軟件系統(tǒng)進行安全性測試過程中,通過對加密MDB文件進行攻擊,獲取到訪問控制權(quán)限信息,成功獲得軟件系統(tǒng)操作權(quán)限,對系統(tǒng)的安全方面造成嚴重影響。
1.5.2 分析及思考
對于97版本的ACCESS數(shù)據(jù)庫文件的有效密碼是13位。不加密時,MDB文件的第67至79位是固定的(86 FB EC 37 5D 44 9C FA C6 5E 28 E6 13);加密時,分別依次用密碼的每一位與上述對應的16進制數(shù)進行異或操作。根據(jù)97版本加密ACCESS數(shù)據(jù)庫的特點,可以將未加密的MDB文件的第67至79位的固定字節(jié)數(shù)據(jù)替換到加密MDB文件的第67至79位字節(jié)位置,從而使加密數(shù)據(jù)庫變?yōu)榉羌用軘?shù)據(jù)庫,進而可以對其內(nèi)容進行隨意讀寫。2000版本的ACCESS數(shù)據(jù)庫文件原理與97差不多,區(qū)別在于每位密碼對應兩個16進制數(shù),其中前一個的16進制數(shù)只起到迷惑作用,沒有實際用處。2000版本ACCESS數(shù)據(jù)庫的破解方法與97版本的ACCESS數(shù)據(jù)庫破解方法類同。
1.5.3 風險控制方法
開發(fā)人員在選取構(gòu)件產(chǎn)品進行應用開發(fā)時應遵循如下流程。分析并列舉備選使用構(gòu)件產(chǎn)品的特性及缺陷;在使用備選構(gòu)件產(chǎn)品前要詳細分析其缺陷對所用軟件開發(fā)功能的影響;對于有影響的,考慮能否通過增加最小技術(shù)手段來彌補;對于無法通過技術(shù)手段彌補或者付出代價過大的,考慮選擇其他軟件工具并重新開始分析;對于無影響的或者通過增加最小技術(shù)手段即可避免其缺陷對所開發(fā)應用帶來影響的構(gòu)件產(chǎn)品,則采用。對于本案例涉及的加密數(shù)據(jù)庫文件安全性問題的解決方法,可以遵照以上的流程和原則,考慮通過對寫入ACCESS數(shù)據(jù)庫的記錄進行加密的技術(shù)手段來彌補97版本加密ACCESS數(shù)據(jù)庫容易被破解的問題。如此即使打開了加密數(shù)據(jù)庫文件,但是文件里的內(nèi)容也都是密文形式存儲,無法辨別其代表的明文內(nèi)容,這樣也就無法獲取文件中的訪問控制權(quán)限信息以對系統(tǒng)安全性方面造成影響。
1.6 過24點后時間信息不一致導致系統(tǒng)癱瘓
1.6.1 場景復現(xiàn)
對需要實時處理顯示的軟件系統(tǒng)來說,時間信息是決定軟件系統(tǒng)能否正常運轉(zhuǎn)的關(guān)鍵。在對此類型軟件系統(tǒng)進行安全性測試時,考慮在模擬仿真環(huán)境下從時間的“24點”、穿越“24點”以及從兩個方向趨近于“24點”作為輸入值測試軟件系統(tǒng)功能實現(xiàn)的正確性,發(fā)現(xiàn)軟件系統(tǒng)在經(jīng)過24點后,無法繼續(xù)顯示系統(tǒng)處理的結(jié)果信息,系統(tǒng)出現(xiàn)癱瘓。
1.6.2 分析及思考
出現(xiàn)以上問題的原因在于實時系統(tǒng)間傳輸?shù)膱笪男畔r間表示不一致,導致系統(tǒng)誤判。通常有兩種表示過24點時間的方法:其一,將一天表示成86400分鐘,當系統(tǒng)時間達到86400分鐘后,程序通過取模運算使時間值翻轉(zhuǎn),系統(tǒng)即而從0開始重新累加計時;其二,系統(tǒng)時間達到86400分鐘后,程序采用單調(diào)遞增方式繼續(xù)累加直至系統(tǒng)時間達到所能表示的最大數(shù)值。當實時系統(tǒng)時間采用這兩種不一致的處理方式時,由于對方系統(tǒng)發(fā)來的實時信息的時間與本系統(tǒng)不一致,本系統(tǒng)會錯判對方發(fā)來的實時信息不是本系統(tǒng)需要的實時信息,導致本系統(tǒng)從此刻開始不再處理對方發(fā)來的任何實時信息數(shù)據(jù),導致系統(tǒng)癱瘓。
1.6.3 風險控制方法
在軟件架構(gòu)設(shè)計時即要統(tǒng)一、明確系統(tǒng)內(nèi)各軟件構(gòu)件關(guān)于時間信息的表示方法,以避免實時軟件系統(tǒng)間由于“時間一致性”而導致系統(tǒng)癱瘓問題。
本文通過對軟件開發(fā)過程中的典型測試案例的分析和描述,總結(jié)出問題的解決方法和預防措施,對確保軟件系統(tǒng)的可靠、安全、穩(wěn)定的運行具有積極意義,對軟件開發(fā)人員及軟件測試人員的工作具有實際的指導意義。
[1] 萬江平,孔學東,楊建梅. 集成能力成熟度模型(CMMI)的研究[J]. 計算機應用研究,2001,(10).
[2] 李興兵,李孟軍,譚躍進. 軍用CMMI模型的建立初探[J]. 兵工自動化,2003,(06).
(編輯:勞邊)
TP306
C
1003–6660(2014)05–0038–04
10.13237/j.cnki.asq.2014.05.011
[收修訂稿日期] 2014-07-13