歡迎來(lái)到培訓(xùn)無(wú)憂(yōu)網(wǎng)!

全國(guó)切換

咨詢(xún)熱線 400-001-5729

位置:培訓(xùn)無(wú)憂(yōu)網(wǎng) > 新聞資訊 > 電腦/IT > 嵌入式開(kāi)發(fā) >  防御性C語(yǔ)言編程在嵌入式開(kāi)發(fā)中的使用方法

防御性C語(yǔ)言編程在嵌入式開(kāi)發(fā)中的使用方法

來(lái)源:m.universityresearchassociates.com 發(fā)布人:云朵

2021-12-04 10:28:18|已瀏覽:295次

防御性C語(yǔ)言編程在嵌入式開(kāi)發(fā)中的使用方法

    嵌入式產(chǎn)品的可靠性自然與硬件密不可分,但在硬件確定、并且沒(méi)有第三方測(cè)試的前提下,使用防御性編程思想寫(xiě)出的代碼,往往具有更高的穩(wěn)定性。防御性編程首先需要認(rèn)清C語(yǔ)言的種種缺陷和陷阱,C語(yǔ)言對(duì)于運(yùn)行時(shí)的檢查十分弱小,需要程序員謹(jǐn)慎的考慮代碼,在必要的時(shí)候增加判斷;防御性編程的另一個(gè)核心思想是假設(shè)代碼運(yùn)行在并不可靠的硬件上,外接干擾有可能會(huì)打亂程序執(zhí)行順序、更改RAM存儲(chǔ)數(shù)據(jù)等等。

1、具有形參的函數(shù),需判斷傳遞來(lái)的實(shí)參是否合法

    程序員可能無(wú)意識(shí)的傳遞了錯(cuò)誤參數(shù);外界的強(qiáng)干擾可能將傳遞的參數(shù)修改掉,或者使用隨機(jī)參數(shù)意外的調(diào)用函數(shù),因此在執(zhí)行函數(shù)主體前,需要先確定實(shí)參是否合法。

2、仔細(xì)檢查函數(shù)的返回值

    對(duì)函數(shù)返回的錯(cuò)誤碼,要進(jìn)行全面仔細(xì)處理,必要時(shí)做錯(cuò)誤記錄。

3、防止指針越界

    如果動(dòng)態(tài)計(jì)算一個(gè)地址時(shí),要保證被計(jì)算的地址是合理的并指向某個(gè)有意義的地方。特別對(duì)于指向一個(gè)結(jié)構(gòu)或數(shù)組的內(nèi)部的指針,當(dāng)指針增加或者改變后仍然指向同一個(gè)結(jié)構(gòu)或數(shù)組。

4、防止數(shù)組越界

    數(shù)組越界的問(wèn)題前文已經(jīng)講述的很多了,由于C不會(huì)對(duì)數(shù)組進(jìn)行有效的檢測(cè),因此必須在應(yīng)用中顯式的檢測(cè)數(shù)組越界問(wèn)題。

5、數(shù)學(xué)算數(shù)運(yùn)算

5.1、除法運(yùn)算,只檢測(cè)除數(shù)為零就可靠嗎?

    除法運(yùn)算前,檢查除數(shù)是否為零幾乎已經(jīng)成為共識(shí),但是僅檢查除數(shù)是否為零就夠了嗎?

    考慮兩個(gè)整數(shù)相除,對(duì)于一個(gè)signed long類(lèi)型變量,它能表示的數(shù)值范圍為:-2147483648 ~+2147483647,如果讓-2147483648/ -1,那么結(jié)果應(yīng)該是+2147483648,但是這個(gè)結(jié)果已經(jīng)超出了signedlong所能表示的范圍了。所以,在這種情況下,除了要檢測(cè)除數(shù)是否為零外,還要檢測(cè)除法是否溢出。

5.2、檢測(cè)運(yùn)算溢出

    整數(shù)的加減乘運(yùn)算都有可能發(fā)生溢出,在討論未定義行為時(shí),給出過(guò)一個(gè)有符號(hào)整形加法溢出判斷代碼。

5.3、檢測(cè)移位

    在討論未定義行為時(shí),提到有符號(hào)數(shù)右移、移位的數(shù)量是負(fù)值或者大于操作數(shù)的位數(shù)都是未定義行為,也提到不對(duì)有符號(hào)數(shù)進(jìn)行位操作,但要檢測(cè)移位的數(shù)量是否大于操作數(shù)的位數(shù)。

6、如果有硬件看門(mén)狗,則使用它

    在其它一切措施都失效的情況下,看門(mén)狗可能是最后的防線。它的原理特別簡(jiǎn)單,但卻能大大提高設(shè)備的可靠性。如果設(shè)備有硬件看門(mén)狗,一定要為它編寫(xiě)驅(qū)動(dòng)程序。

7、關(guān)鍵數(shù)據(jù)儲(chǔ)存多個(gè)備份,取數(shù)據(jù)采用“表決法”

    RAM中的數(shù)據(jù)在受到干擾情況下有可能被改變,對(duì)于系統(tǒng)關(guān)鍵數(shù)據(jù)應(yīng)該進(jìn)行保護(hù)。關(guān)鍵數(shù)據(jù)包括全局變量、靜態(tài)變量以及需要保護(hù)的數(shù)據(jù)區(qū)域。備份數(shù)據(jù)與原數(shù)據(jù)不應(yīng)該處于相鄰位置,因此不應(yīng)由編譯器默認(rèn)分配備份數(shù)據(jù)位置,而應(yīng)該由程序員指定區(qū)域存儲(chǔ)。

    可以將RAM分為3個(gè)區(qū)域,第一個(gè)區(qū)域保存原碼,第二個(gè)區(qū)域保存反碼,第三個(gè)區(qū)域保存異或碼,區(qū)域之間預(yù)留一定量的“空白”RAM作為隔離?梢允褂镁幾g器的“分散加載”機(jī)制將變量分別存儲(chǔ)在這些區(qū)域。需要進(jìn)行讀取時(shí),同時(shí)讀出3份數(shù)據(jù)并進(jìn)行表決,取至少有兩個(gè)相同的那個(gè)值。

8、對(duì)非易失性存儲(chǔ)器進(jìn)行備份存儲(chǔ)

    非易失性存儲(chǔ)器包括但不限于Flash、EEPROM、鐵電。僅僅將寫(xiě)入非易失性存儲(chǔ)器中的數(shù)據(jù)再讀出校驗(yàn)是不夠的。強(qiáng)干擾情況下可能導(dǎo)致非易失性存儲(chǔ)器內(nèi)的數(shù)據(jù)錯(cuò)誤,在寫(xiě)非易失性存儲(chǔ)器的期間系統(tǒng)掉電將導(dǎo)致數(shù)據(jù)丟失,因干擾導(dǎo)致程序跑飛到寫(xiě)非易失性存儲(chǔ)器函數(shù)中,將導(dǎo)致數(shù)據(jù)存儲(chǔ)紊亂。

    一種可靠的辦法是將非易失性存儲(chǔ)器分成多個(gè)區(qū),每個(gè)數(shù)據(jù)都將按照不同的形式寫(xiě)入到這些分區(qū)中,需要進(jìn)行讀取時(shí),同時(shí)讀出多份數(shù)據(jù)并進(jìn)行表決,取相同數(shù)目較多的那個(gè)值。

9、軟件鎖

    對(duì)于初始化序列或者有一定先后順序的函數(shù)調(diào)用,為了保證調(diào)用順序或者確保每個(gè)函數(shù)都被調(diào)用,我們可以使用環(huán)環(huán)相扣,實(shí)質(zhì)上這也是一種軟件鎖。此外對(duì)于一些安全關(guān)鍵代碼語(yǔ)句(是語(yǔ)句,而不是函數(shù)),可以給它們?cè)O(shè)置軟件鎖,只有持有特定鑰匙的,才可以訪問(wèn)這些關(guān)鍵代碼。也可以通俗的理解為,關(guān)鍵安全代碼不能按照單一條件執(zhí)行,要額外的多設(shè)置一個(gè)標(biāo)志。

    比如,向Flash寫(xiě)一個(gè)數(shù)據(jù),我們會(huì)判斷數(shù)據(jù)是否合法、寫(xiě)入的地址是否合法,計(jì)算要寫(xiě)入的扇區(qū)。之后調(diào)用寫(xiě)Flash子程序,在這個(gè)子程序中,判斷扇區(qū)地址是否合法、數(shù)據(jù)長(zhǎng)度是否合法,之后就要將數(shù)據(jù)寫(xiě)入Flash。

    由于寫(xiě)Flash語(yǔ)句是安全關(guān)鍵代碼,所以程序給這些語(yǔ)句上鎖:必須具有正確的鑰匙才可以寫(xiě)Flash。這樣即使是程序跑飛到寫(xiě)Flash子程序,也能大大降低誤寫(xiě)的風(fēng)險(xiǎn)。

    本文由培訓(xùn)無(wú)憂(yōu)網(wǎng)達(dá)內(nèi)教育課程顧問(wèn)老師整理發(fā)布,更多課程信息可關(guān)注嵌入式開(kāi)發(fā)培訓(xùn)或添加老師微信:15033336050

      注:尊重原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處和鏈接 http://m.universityresearchassociates.com/news-id-6215.html 違者必究!部分文章來(lái)源于網(wǎng)絡(luò)由培訓(xùn)無(wú)憂(yōu)網(wǎng)編輯部人員整理發(fā)布,內(nèi)容真實(shí)性請(qǐng)自行核實(shí)或聯(lián)系我們,了解更多相關(guān)資訊請(qǐng)關(guān)注嵌入式開(kāi)發(fā)頻道查看更多,了解相關(guān)專(zhuān)業(yè)課程信息您可在線咨詢(xún)也可免費(fèi)申請(qǐng)?jiān)囌n。關(guān)注官方微信了解更多:150 3333 6050

留下你的信息,課程顧問(wèn)老師會(huì)一對(duì)一幫助你規(guī)劃更適合你的專(zhuān)業(yè)課程!
  • 姓名:

  • 手機(jī):

  • 地區(qū):

  • 想學(xué)什么:

  • 培訓(xùn)無(wú)憂(yōu)網(wǎng)
免 費(fèi) 申 請(qǐng) 試 聽(tīng)
提交申請(qǐng),《培訓(xùn)無(wú)憂(yōu)網(wǎng)》課程顧問(wèn)老師會(huì)一對(duì)一幫助你規(guī)劃更適合你的專(zhuān)業(yè)課程!