在實(shí)驗(yàn)室中有效的方法并不總是在現(xiàn)場工作,通常是由于意外的交互和未發(fā)現(xiàn)的錯(cuò)誤。防御性編程可以幫助提高設(shè)計(jì)的彈性,但開發(fā)能夠處理不可預(yù)見情況的嵌入式軟件并非易事;它需要紀(jì)律和深謀遠(yuǎn)慮。以下是幫助開發(fā)人員成為更好的防御性程序員的五個(gè)技巧。
技巧1 -校驗(yàn)和或CRC數(shù)據(jù)
使用校驗(yàn)和和循環(huán)冗余校驗(yàn)( CRC)算法是開發(fā)人員驗(yàn)證通過串行鏈路發(fā)送的數(shù)據(jù)確實(shí)正確的好方法。經(jīng)過審查的嵌入式系統(tǒng)在測試臺(tái)的受控環(huán)境中始終表現(xiàn)如預(yù)期。然而,一旦系統(tǒng)被釋放到野外,系統(tǒng)運(yùn)行的環(huán)境就變得非常未知。嘈雜的環(huán)境可能會(huì)產(chǎn)生通信噪聲,導(dǎo)致位翻轉(zhuǎn)和誤讀數(shù)據(jù)。檢測此損壞數(shù)據(jù)的最佳希望是通過使用校驗(yàn)和或CRC對(duì)數(shù)據(jù)進(jìn)行健全性檢查。
提示2 -按合同設(shè)計(jì)
按合同設(shè)計(jì)是一種開發(fā)軟件的方法,可以生成高度定義的軟件界面,每個(gè)函數(shù)都與之相關(guān)聯(lián)具有明確的前提條件和后置條件。我們的想法是,如果應(yīng)用程序要調(diào)用特定函數(shù),則調(diào)用應(yīng)用程序必須滿足函數(shù)的前置條件才能獲得有效的響應(yīng)或操作。按合同設(shè)計(jì)對(duì)開發(fā)人員來說可能是一個(gè)強(qiáng)大的工具,因?yàn)樗鞔_指定了函數(shù)期望接收的內(nèi)容以及有效前置條件下的保證輸出。由于期望不是“在線之間讀取”,因此調(diào)用該函數(shù)的開發(fā)人員確切地知道了使用該函數(shù)的期望是什么。
技巧3 -使用斷言
斷言宏是開發(fā)人員驗(yàn)證其應(yīng)用假設(shè)的好方法在應(yīng)用程序中的給定點(diǎn)。斷言的使用對(duì)于在bug發(fā)生時(shí)捕獲程序中的錯(cuò)誤和意外行為非常有用。斷言甚至可以在契約式設(shè)計(jì)環(huán)境中使用,以驗(yàn)證合同的前提條件和后置條件是否已得到滿足。有關(guān)在嵌入式軟件中使用斷言的介紹,請(qǐng)考慮閱讀8個(gè)使用C中的斷言和何時(shí)斷言或不斷言來壓縮錯(cuò)誤的提示。
提示4 -檢查指針和緩沖區(qū)
指針和緩沖區(qū)是開發(fā)人員似乎總是遇到麻煩的兩個(gè)地方。在C中開發(fā)嵌入式系統(tǒng)時(shí),很容易意外地取消引用NULL指針或溢出緩沖區(qū)。防御程序員應(yīng)該在取消引用之前檢查指針的有效性。指針是否為NULL?不要去除它!存儲(chǔ)在指針中的值是否為有效值?如果是,則取消引用。
指針?biāo)惴ê蛿?shù)組的使用也很危險(xiǎn)。開發(fā)人員應(yīng)該在緩沖區(qū)和指針?biāo)阈g(shù)運(yùn)算中添加邊界檢查,以確保結(jié)果保留在它們應(yīng)該的內(nèi)存空間內(nèi)。意外地僅通過一個(gè)字節(jié)覆蓋內(nèi)存可能會(huì)對(duì)嵌入式系統(tǒng)產(chǎn)生災(zāi)難性后果,更重要的是會(huì)對(duì)其用戶造成災(zāi)難性后果。
提示5 -使用堆棧監(jiān)視器
執(zhí)行最壞情況的堆棧分析并正確調(diào)整堆棧大小是一項(xiàng)艱巨的任務(wù)。通常,堆棧的大小要么保留在編譯器的默認(rèn)設(shè)置中,要么開發(fā)人員在一張紙上寫下幾個(gè)可能的值并使用“eeny meeny miny moe”技術(shù)。這兩種技術(shù)都不夠,堆棧溢出的最壞情況成為現(xiàn)實(shí)。
開發(fā)人員可以通過監(jiān)視此類事件來幫助防止堆棧溢出。大多數(shù)實(shí)時(shí)操作系統(tǒng)都內(nèi)置了堆棧監(jiān)視器。啟用堆棧監(jiān)視器只不過是使用RTOS的配置調(diào)整宏。在裸機(jī)系統(tǒng)中,開發(fā)人員需要更加積極主動(dòng),并且要么自己編寫堆棧監(jiān)視器,要么使用可以在Internet上找到的許多可用堆棧監(jiān)視器之一。要了解有關(guān)堆棧監(jiān)視器的更多信息,請(qǐng)考慮通過七個(gè)簡單步驟閱讀創(chuàng)建堆棧監(jiān)視器并使用堆棧防護(hù)改進(jìn)代碼完整性
最后的想法
這五個(gè)技巧只是開發(fā)人員如何通過防御性編程改進(jìn)嵌入式軟件的幾個(gè)例子。還有許多其他技術(shù),例如編寫安全代碼和加密數(shù)據(jù),這些技術(shù)可以幫助提高嵌入式系統(tǒng)即使在不可預(yù)見的情況下也能繼續(xù)運(yùn)行的機(jī)會(huì)。
-
程序員
+關(guān)注
關(guān)注
4文章
954瀏覽量
30392 -
PCB打樣
+關(guān)注
關(guān)注
17文章
2977瀏覽量
22540 -
華強(qiáng)PCB
+關(guān)注
關(guān)注
8文章
1831瀏覽量
28583 -
華強(qiáng)pcb線路板打樣
+關(guān)注
關(guān)注
5文章
14629瀏覽量
43897
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論