0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

代碼防御性編程不得不知的技巧

Q4MP_gh_c472c21 ? 來源:C語言與CPP編程 ? 作者:自成一派123 ? 2021-11-22 09:49 ? 次閱讀

1 什么是防御性編程?顧名思義,防御性編程是一種細(xì)致、謹(jǐn)慎的編程方法。為了開發(fā)可靠的軟件,我們要設(shè)計系統(tǒng)中的每個組件,以使其盡可能的”保護(hù)”自己。我們通過明確地在代碼中對設(shè)想進(jìn)行檢查,這是一種努力,防止我們的代碼以將會展現(xiàn)錯誤行為的方式被調(diào)用。

防御性編程使我們可以盡早的發(fā)現(xiàn)較小的問題,而不是等到它們發(fā)展成大的災(zāi)難的時候才發(fā)現(xiàn)。其開發(fā)軟件的過程是:

下面總結(jié)了一些防御性編程的反對和支持者的意見:

反對者:

它降低了代碼的效;即使是一個很小的額外代碼也需要一些額外的執(zhí)行時間。它對于一個函數(shù)來說也許不要緊,但是對于一個由10萬個函數(shù)組成的系統(tǒng),問題就變得嚴(yán)重了。

每種防御性的做法都需要一些額外的工作;

支持者:

防御性編程可以節(jié)省大量的調(diào)試時間,使你可以去做更有意義的事情。

編寫可以正常運(yùn)行、只是速度有些慢的代碼,要遠(yuǎn)遠(yuǎn)好過大多數(shù)時間都正常運(yùn)行、但是有時候會崩潰的代碼。

防御性編程避免了大量的安全性問題。

防御性編程技巧使用好的編碼風(fēng)格和合理的設(shè)計

采用良好的編碼風(fēng)格,來防范大多數(shù)編碼錯誤。如:

const關(guān)鍵字:

關(guān)鍵字const可以給讀你代碼的人傳達(dá)非常有用的信息。例如,在函數(shù)的形參前添加const關(guān)鍵字意味著這個參數(shù)在函數(shù)體內(nèi)不會被修改,屬于輸入?yún)?shù)。

同時,合理地使用關(guān)鍵字const可以使編譯器很自然的保護(hù)那些不希望被修改的參數(shù),防止其被無意的代碼修改,減少bug的出現(xiàn)。

volatile關(guān)鍵字:

在一些并行設(shè)備的硬件寄存器(如狀態(tài)寄存器),中斷服務(wù)子程序中會訪問到的全局變量以及多線程應(yīng)用中被幾個任務(wù)共享的變量前使用volatile關(guān)鍵字來防止編譯優(yōu)化。

static關(guān)鍵字:

函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時仍維持上次的值。

在模塊內(nèi)的static全局變量可以被模塊內(nèi)的所有函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。

在模塊內(nèi)的static函數(shù)只可能被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個函數(shù)的使用范圍被限制在聲明它的模塊內(nèi)。

位操作運(yùn)算中,盡可能使用《《、 》》、 &、|等運(yùn)算符,盡可能少使用/、%、*運(yùn)算符。

變量和函數(shù)的命名要有意義,并且盡可能做到一個函數(shù)只做一件事情。

多采用面向?qū)ο蟮乃枷雭砭帉懘a。

在投入到編碼工作之前,先考慮大體的設(shè)計方案,這也非常關(guān)鍵。

不要倉促的編寫代碼

欲速則不達(dá),每敲一個字,都要想清楚你要輸入的是什么。在寫每一行時都三思而后行??赡軙霈F(xiàn)什么樣的錯誤?你是否已經(jīng)考慮了所有可能出現(xiàn)的邏輯分支?放慢速度,有條不紊的編程雖然看上去很平凡,但這的確是減少缺陷的好辦法。

C語言編程中,追求速度的程序員經(jīng)常會出現(xiàn)的一個問題就是將”==”錯誤的輸入為”=”,而有些編譯器并不會警告,這就會造成問題。

不要相信任何人

這里是指用懷疑的眼光來審視所有的輸入和所有的結(jié)果,直到你能證明這段代碼是正確的時候?yàn)橹埂?/p>

編碼的目標(biāo)要清晰,而不是簡潔

簡單是一種美,不要讓你的代碼過于復(fù)雜。即編寫的代碼一定要邏輯清晰,可讀性強(qiáng)。

編譯時打開所有警告開關(guān)

在你的代碼中產(chǎn)生任何警告信息,都應(yīng)立即修正代碼。要知道警告的出現(xiàn)總是有原因的。即使你認(rèn)為某個警告無關(guān)緊要,也不要置之不理。

使用安全的數(shù)據(jù)結(jié)構(gòu)

我們最常見的一些安全隱患大概是由緩沖溢出引起的。緩沖溢出是由于不正確的使用固定大小的數(shù)據(jù)結(jié)構(gòu)而造成的。例如,如下這個代碼:

char * unsafe_copy(const char * source)

{

char *buffer = new char[10];

strcpy(buffer,source);

return buffer;

}

如果source中的數(shù)據(jù)長度超過10個字符,它就會造成其它問題。我們可以改成如下形式:

char * safe_copy(const char * source)

{

char *buffer = new char[10];

strncpy(buffer,source,10); //用strncpy代替strcpy可以保護(hù)這個代碼段

return buffer;

}

檢查所有的返回值

如果一個函數(shù)返回一個值,他這樣做肯定是有理由的。檢查這個返回值,如果返回值是一個錯誤代碼,你就必須辨別這個代碼并處理所有的錯誤。不要讓錯誤悄無聲息的侵入你的程序;大多數(shù)難以察覺的錯誤都是因?yàn)槌绦騿T沒有檢查返回值而出現(xiàn)的。

審慎的處理內(nèi)存

對于在執(zhí)行期間所獲取的任何資源,必須徹底釋放。

在聲明位置初始化所有變量

如果你意外的使用了一個沒有初始化的變量,那么你的程序在每次運(yùn)行的時候都將得到不同的結(jié)果,這取決于當(dāng)時內(nèi)存中的垃圾信息是什么。這樣會造成很多隨機(jī)的行為,給查找?guī)砗芏嗟穆闊?。因此,需要在聲明每個變量的時候就對它進(jìn)行初始化。

同時,平時編碼時還要注意一些細(xì)則

提供默認(rèn)的行為:Switch語句中將default case的執(zhí)行明示出來。同樣地,如果你要編寫一些不帶else子句的if語句,停下來想一想,你是否該處理這個邏輯上的默認(rèn)情況

檢查數(shù)值的上下限:確保每次運(yùn)算數(shù)值變量都不會溢出,即數(shù)據(jù)類型的使用要謹(jǐn)慎

注意強(qiáng)制轉(zhuǎn)換是否合理

聲明變量,可以使變量的聲明位置與使用它的位置盡量接近,從而防止它干擾代碼的其他部分

加合理的異常處理、日志文件

正確設(shè)置常量

優(yōu)秀的程序應(yīng)該做到:關(guān)心代碼是否健壯

確保每個設(shè)想都顯示地體現(xiàn)在防御性代碼中

希望代碼對無用信息的輸入有正確的行為

在編程的時候認(rèn)真思考自己所編寫的代碼

編寫可以保護(hù)自己不受其他人的愚蠢傷害的代碼。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3566

    瀏覽量

    93539
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4723

    瀏覽量

    68237

原文標(biāo)題:代碼防御性編程的10條技巧

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【解決方案】提升新能源汽車?yán)m(xù)航能力,你不得不知曉的測量知識

    前言對于以新能源車為代表的電動出行(E-Mobility)來說,續(xù)航里程的提高是最重要的課題之一。為了實(shí)現(xiàn)這一點(diǎn),除了要掌握電池和大功率的動力傳動系統(tǒng)的狀態(tài)外,還要掌握ECU和電裝設(shè)備等零部件的功耗和暗電流。何為汽車暗電流?暗電流(darkcurrent),指點(diǎn)火開關(guān)在OFF的位置(汽車無工作的狀態(tài),也可以指靜止休眠狀態(tài))時,仍然在流動的電流,又可稱為“靜態(tài)
    的頭像 發(fā)表于 09-05 11:22 ?217次閱讀
    【解決方案】提升新能源汽車?yán)m(xù)航能力,你<b class='flag-5'>不得不知</b>曉的測量知識

    不得不知的pcba加工規(guī)則:確保元器件安全可靠

    一站式PCBA智造廠家今天為大家講講PCBA加工如何確保質(zhì)量和性能的穩(wěn)定性?PCBA加工規(guī)則。在PCBA加工生產(chǎn)過程中,嚴(yán)格遵守操作規(guī)則至關(guān)重要,以確保元器件的安全和可靠。以下是幾個基礎(chǔ)而重要
    的頭像 發(fā)表于 08-26 09:25 ?219次閱讀

    防御性編程:讓系統(tǒng)堅不可摧

    1. 引言 面對復(fù)雜多變的運(yùn)行環(huán)境、不可預(yù)測的用戶輸入以及潛在的編程錯誤,如何確保軟件在遭遇異常情況時依然能夠穩(wěn)定運(yùn)行,是每位開發(fā)者必須面對的挑戰(zhàn)。防御性編程(Defensive
    的頭像 發(fā)表于 07-25 14:04 ?234次閱讀

    精密空調(diào)—不得不服的精密空調(diào)"黑科技"!逆天了#精密空調(diào)

    精密空調(diào)
    北京匯智天源
    發(fā)布于 :2024年07月20日 12:33:01

    不得不愛的保護(hù)裝置-安全就這么簡單

    保護(hù)裝置
    jf_18500570
    發(fā)布于 :2024年07月01日 10:20:02

    用aurix development studio調(diào)試代碼時,導(dǎo)致調(diào)試中斷的原因?

    當(dāng)我用 aurix development studio 調(diào)試代碼時,總是出現(xiàn)嚴(yán)重錯誤,導(dǎo)致調(diào)試中斷,我不得不重啟 studio,然后重新開始調(diào)試。 當(dāng)我點(diǎn)擊進(jìn)入某些代碼行時,錯誤總是發(fā)生,這些
    發(fā)表于 06-03 08:11

    工科人關(guān)于T3Ster熱阻測試儀不得不知道的九大特點(diǎn)

    T3Ster是一款先進(jìn)的半導(dǎo)體器件封裝熱特性測試儀器,在數(shù)分鐘內(nèi)提供各類封裝的熱特性數(shù)據(jù)。T3Ster專為半導(dǎo)體、電子應(yīng)用和LED行業(yè)以及研發(fā)實(shí)驗(yàn)室的應(yīng)用而設(shè)計。系統(tǒng)包括易用的軟件部分和硬件部分,T3Ster用來測量封裝半導(dǎo)體器件以及其他電子設(shè)備的瞬態(tài)熱特性,測量的器件包括分離或集成的雙極型晶體管、MOS晶體管、常見的三極管、LED封裝和半導(dǎo)體閘流管,各種封裝類型的器件和微機(jī)電系統(tǒng)的一些部件。因其配備的專業(yè)的設(shè)備和軟件,它也能測試PWB、
    的頭像 發(fā)表于 04-25 09:12 ?594次閱讀
    工科人關(guān)于T3Ster熱阻測試儀<b class='flag-5'>不得不知</b>道的九大特點(diǎn)

    關(guān)于MCU選型不得不知的學(xué)問

    MCU選得好不好,往往決定著產(chǎn)品和商業(yè)OK不OK。 這個質(zhì)量,可能是芯片抗干擾強(qiáng)不強(qiáng)?能不能過產(chǎn)品認(rèn)證? 也可能是在某一溫度能否穩(wěn)定運(yùn)行? 還有可能是有些應(yīng)用外設(shè)有沒有坑?
    的頭像 發(fā)表于 04-15 10:16 ?389次閱讀

    計算機(jī)最核心的——CPU

    在CPU的四個結(jié)構(gòu)中,寄存器的重要遠(yuǎn)遠(yuǎn)高于其余三個,為什么這么說?因?yàn)槌绦蛲ǔJ前鸭拇嫫髯鳛閷ο髞磉M(jìn)行描述的。而說到寄存器,就不得不說到匯編語言,說到匯編語言,就不得不說到高級語言,說起高級語言也就
    發(fā)表于 03-13 14:04 ?1558次閱讀
    計算機(jī)最核心的——CPU

    一不小心就炸機(jī)!你不得不知道的,示波器測試的共地問題

    大家都知道示波器的檢測探頭測到哪里,哪里就和示波器共地。兩個不共地的檢測點(diǎn),一旦被同一個示波器檢測時,它們就會自動共地。多通道測試時,一定要注意這個問題。 1.測試兩組共地信號 如下示意圖: 輸入1V的小信號,經(jīng)過信號的處理放大,輸出100V的大信號。 想知道輸出波形是否失真,有時候肉眼不一定能夠看出來。這時候需要測試輸入波形,再跟輸出波形進(jìn)行對比。因?yàn)檩斎胼敵鲂盘柖际枪驳氐?,所以可以用一般的無源單端探頭進(jìn)行測試,如
    的頭像 發(fā)表于 02-27 10:06 ?1413次閱讀
    一不小心就炸機(jī)!你<b class='flag-5'>不得不知</b>道的,示波器測試的共地問題

    GD32固件庫里時鐘配置時的神秘代碼?高頻切低頻時芯片會發(fā)生什么

    在GD固件庫的時鐘配置函數(shù)里看到這樣一段神秘代碼,研究分析后不得不佩服原廠固件庫里的細(xì)節(jié)處理
    的頭像 發(fā)表于 02-19 09:44 ?591次閱讀
    GD32固件庫里時鐘配置時的神秘<b class='flag-5'>代碼</b>?高頻切低頻時芯片會發(fā)生什么

    一種動態(tài)防御策略——移動目標(biāo)防御(MTD)

    網(wǎng)絡(luò)攻擊的技術(shù)變得愈發(fā)難測,網(wǎng)絡(luò)攻擊者用多態(tài)、混淆、加密和自我修改喬裝他們的惡意軟件,以此逃避防御性的檢測,于是移動目標(biāo)防御(MTD)技術(shù)出現(xiàn)了,通過動態(tài)地改變攻擊面,有效地對抗日益復(fù)雜和隱蔽
    的頭像 發(fā)表于 01-04 08:04 ?1422次閱讀
    一種動態(tài)<b class='flag-5'>防御</b>策略——移動目標(biāo)<b class='flag-5'>防御</b>(MTD)

    PCB設(shè)計工程師不得不知的法則

    PCB是進(jìn)行設(shè)計的物理平臺,也是用于原始組件進(jìn)行電子系統(tǒng)設(shè)計的靈活部件。本文將介紹幾種PCB設(shè)計黃金法則,這些法則自25年前商用PCB設(shè)計誕生以來,大多沒有任何改變,且廣泛適用于各種PCB設(shè)計項目
    發(fā)表于 12-20 15:57 ?172次閱讀

    Morphisec革命:利用移動目標(biāo)防御增強(qiáng)Windows安全

    Windows10安全工具陣列仍然存在明顯的防御漏洞,Morphisec通過其革命的自動移動目標(biāo)防御(AutomatedMovingTargetDefense)技術(shù),強(qiáng)化Windows10安全
    的頭像 發(fā)表于 12-09 10:00 ?1015次閱讀
    Morphisec革命:利用移動目標(biāo)<b class='flag-5'>防御</b>增強(qiáng)Windows安全<b class='flag-5'>性</b>

    樹莓派Pico如何使用PIO程序呢?

    在這篇教程中,我們看到的代碼看起來與其他的部分的代碼非常不同。那是因?yàn)槲覀兇蠖鄶?shù)時候不得不在 MCU 的底層處理事情。
    的頭像 發(fā)表于 11-14 15:06 ?1814次閱讀
    樹莓派Pico如何使用PIO程序呢?