嵌入式軟件設計中查找缺陷的幾個技巧
部分軟件開發(fā)項目依靠結合代碼檢查、結構測試和功能測試來識別軟件缺陷。盡管這些傳統(tǒng)技術非常重要,而且能發(fā)現(xiàn)大多數(shù)軟件問題,但它們無法檢查出當今復雜系統(tǒng)中的許多共性錯誤。本文將介紹如何避免那些隱蔽然而常見的錯誤,并介紹的幾個技巧幫助工程師發(fā)現(xiàn)軟件中隱藏的錯誤。
結構測試或白盒測試能有效地發(fā)現(xiàn)代碼中的邏輯、控制流、計算和數(shù)據(jù)錯誤。這項測試要求對軟件的內(nèi)部工作能夠一覽無遺(因此稱為白盒或玻璃盒),以便了解軟件結構的詳細情況。它檢查每個條件表達式、數(shù)學操作、輸入和輸出。由于需要測試的細節(jié)眾多,結構測試每次檢查一個軟件單元,通常為一個函數(shù)或類。
代碼審查也使用與實現(xiàn)缺陷和潛在問題查找同樣復雜的技術。與白盒測試一樣,審查通常針對軟件的各個單元進行,因為一個有效的審查過程要求的是集中而詳盡的檢查。
與審查和白盒測試不同,功能測試或黑盒測試假設對軟件的實現(xiàn)一無所知,它測試由受控輸入所驅(qū)動的輸出。功能測試由測試人員或開發(fā)人員所編寫的測試過程組成,它們規(guī)定了一組特定程序輸入對應的預期程序輸出。測試運行之后,測試人員將實際輸出與預期輸出進行比較,查找問題。黑盒測試可以有效地找出未能實現(xiàn)的需求、接口問題、性能問題和程序最常用功能中的錯誤。
雖然將這些技術結合起來可以找出隱藏在一個特定軟件程序中的大部分錯誤,但它們也有局限。代碼審查和白盒測試每次只針對一小部分代碼,忽視了系統(tǒng)的其它部分。黑盒測試通常將系統(tǒng)作為一個整體來處理,忽視了實現(xiàn)的細節(jié)。一些重要的問題只有在集中考察它們在整個系統(tǒng)內(nèi)相互作用時的細節(jié)才能被發(fā)現(xiàn);傳統(tǒng)的方法無法可靠地找出這些問題。必須整體地檢查軟件系統(tǒng),查找具體問題的特定原因。由于詳盡徹底地分析程序中的每個細節(jié)和它與代碼中所有其它部分之間的相互作用通常是不大可能的,因此分析應該針對程序中已經(jīng)知道可能導致問題的特定方面。本文將探討其中三個潛在的問題領域:
* 堆棧溢出
* 競爭條件
* 死鎖
讀者可在網(wǎng)上閱讀本文的第二部分,它將探討下列問題:
* 時序問題
* 可重入條件
在采用多任務實時設計技術的系統(tǒng)中,以上所有問題都相當普遍。
一、堆棧溢出
處理器使用堆棧來存儲臨時變量、向被調(diào)函數(shù)傳遞參數(shù)、保存線程“狀態(tài)”,等等。如果系統(tǒng)不使用虛擬內(nèi)存(換句話說,它不能將內(nèi)存頁面轉(zhuǎn)移到磁盤上以釋放內(nèi)存空間供其它用途),堆棧將固定為產(chǎn)品出廠時的大小。如果由于某種原因堆棧越出了編程人員所分配的數(shù)量范圍,程序?qū)⒆兊貌淮_定。這種不穩(wěn)定可能導致系統(tǒng)發(fā)生嚴重故障。因此,確保系統(tǒng)在最壞情況下能夠分配到足夠的堆棧至關重要。
表1:堆棧分析表格的一部分
評論