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