2021-12-04 10:28:18|已瀏覽:336次
嵌入式產品的可靠性自然與硬件密不可分,但在硬件確定、并且沒有第三方測試的前提下,使用防御性編程思想寫出的代碼,往往具有更高的穩定性。防御性編程首先需要認清C語言的種種缺陷和陷阱,C語言對于運行時的檢查十分弱小,需要程序員謹慎的考慮代碼,在必要的時候增加判斷;防御性編程的另一個核心思想是假設代碼運行在并不可靠的硬件上,外接干擾有可能會打亂程序執行順序、更改RAM存儲數據等等。
1、具有形參的函數,需判斷傳遞來的實參是否合法
程序員可能無意識的傳遞了錯誤參數;外界的強干擾可能將傳遞的參數修改掉,或者使用隨機參數意外的調用函數,因此在執行函數主體前,需要先確定實參是否合法。
2、仔細檢查函數的返回值
對函數返回的錯誤碼,要進行全面仔細處理,必要時做錯誤記錄。
3、防止指針越界
如果動態計算一個地址時,要保證被計算的地址是合理的并指向某個有意義的地方。特別對于指向一個結構或數組的內部的指針,當指針增加或者改變后仍然指向同一個結構或數組。
4、防止數組越界
數組越界的問題前文已經講述的很多了,由于C不會對數組進行有效的檢測,因此必須在應用中顯式的檢測數組越界問題。
5、數學算數運算
5.1、除法運算,只檢測除數為零就可靠嗎?
除法運算前,檢查除數是否為零幾乎已經成為共識,但是僅檢查除數是否為零就夠了嗎?
考慮兩個整數相除,對于一個signed long類型變量,它能表示的數值范圍為:-2147483648 ~+2147483647,如果讓-2147483648/ -1,那么結果應該是+2147483648,但是這個結果已經超出了signedlong所能表示的范圍了。所以,在這種情況下,除了要檢測除數是否為零外,還要檢測除法是否溢出。
5.2、檢測運算溢出
整數的加減乘運算都有可能發生溢出,在討論未定義行為時,給出過一個有符號整形加法溢出判斷代碼。
5.3、檢測移位
在討論未定義行為時,提到有符號數右移、移位的數量是負值或者大于操作數的位數都是未定義行為,也提到不對有符號數進行位操作,但要檢測移位的數量是否大于操作數的位數。
6、如果有硬件看門狗,則使用它
在其它一切措施都失效的情況下,看門狗可能是最后的防線。它的原理特別簡單,但卻能大大提高設備的可靠性。如果設備有硬件看門狗,一定要為它編寫驅動程序。
7、關鍵數據儲存多個備份,取數據采用“表決法”
RAM中的數據在受到干擾情況下有可能被改變,對于系統關鍵數據應該進行保護。關鍵數據包括全局變量、靜態變量以及需要保護的數據區域。備份數據與原數據不應該處于相鄰位置,因此不應由編譯器默認分配備份數據位置,而應該由程序員指定區域存儲。
可以將RAM分為3個區域,第一個區域保存原碼,第二個區域保存反碼,第三個區域保存異或碼,區域之間預留一定量的“空白”RAM作為隔離。可以使用編譯器的“分散加載”機制將變量分別存儲在這些區域。需要進行讀取時,同時讀出3份數據并進行表決,取至少有兩個相同的那個值。
8、對非易失性存儲器進行備份存儲
非易失性存儲器包括但不限于Flash、EEPROM、鐵電。僅僅將寫入非易失性存儲器中的數據再讀出校驗是不夠的。強干擾情況下可能導致非易失性存儲器內的數據錯誤,在寫非易失性存儲器的期間系統掉電將導致數據丟失,因干擾導致程序跑飛到寫非易失性存儲器函數中,將導致數據存儲紊亂。
一種可靠的辦法是將非易失性存儲器分成多個區,每個數據都將按照不同的形式寫入到這些分區中,需要進行讀取時,同時讀出多份數據并進行表決,取相同數目較多的那個值。
9、軟件鎖
對于初始化序列或者有一定先后順序的函數調用,為了保證調用順序或者確保每個函數都被調用,我們可以使用環環相扣,實質上這也是一種軟件鎖。此外對于一些安全關鍵代碼語句(是語句,而不是函數),可以給它們設置軟件鎖,只有持有特定鑰匙的,才可以訪問這些關鍵代碼。也可以通俗的理解為,關鍵安全代碼不能按照單一條件執行,要額外的多設置一個標志。
比如,向Flash寫一個數據,我們會判斷數據是否合法、寫入的地址是否合法,計算要寫入的扇區。之后調用寫Flash子程序,在這個子程序中,判斷扇區地址是否合法、數據長度是否合法,之后就要將數據寫入Flash。
由于寫Flash語句是安全關鍵代碼,所以程序給這些語句上鎖:必須具有正確的鑰匙才可以寫Flash。這樣即使是程序跑飛到寫Flash子程序,也能大大降低誤寫的風險。
本文由培訓無憂網達內教育課程顧問老師整理發布,更多課程信息可關注嵌入式開發培訓或添加老師微信:15033336050
注:尊重原創文章,轉載請注明出處和鏈接 http://m.dedgn.cn/news-id-6215.html 違者必究!部分文章來源于網絡由培訓無憂網編輯部人員整理發布,內容真實性請自行核實或聯系我們,了解更多相關資訊請關注嵌入式開發頻道查看更多,了解相關專業課程信息您可在線咨詢也可免費申請試課。關注官方微信了解更多:150 3333 6050
姓名:
手機:
地區: