日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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


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é)了一些防御性編程的反對和支持者的意見:

反對者:

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

支持者:

  1. 防御性編程可以節(jié)省大量的調(diào)試時間,使你可以去做更有意義的事情。
  2. 編寫可以正常運(yùn)行、只是速度有些慢的代碼,要遠(yuǎn)遠(yuǎn)好過大多數(shù)時間都正常運(yùn)行、但是有時候會崩潰的代碼。
  3. 防御性編程避免了大量的安全性問題。

防御性編程技巧

  1. 使用好的編碼風(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)鍵字:
  1. 函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時仍維持上次的值。
  2. 在模塊內(nèi)的static全局變量可以被模塊內(nèi)的所有函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。
  3. 在模塊內(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)鍵。

  1. 不要倉促的編寫代碼

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

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

  1. 不要相信任何人

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

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

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

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

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

  1. 使用安全的數(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;
}
  1. 檢查所有的返回值

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

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

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

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

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

  1. 同時,平時編碼時還要注意一些細(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ù)自己不受其他人的愚蠢傷害的代碼。
                                                                        
本文授權(quán)轉(zhuǎn)載自公眾號“C語言與CPP編程”,作者自成一派123

-END-




推薦閱讀



【01】C語言十大經(jīng)典排序算法(動態(tài)演示+代碼,值得收藏)
【02】C語言、嵌入式中幾個非常實(shí)用的宏技巧
【03】C語言最全入門筆記
【04】絕對能檢測你C語言基礎(chǔ)水平的5個面試題
【05】C語言為何不會過時?你需要掌握多少種語言?

免責(zé)聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀

深圳2026年3月19日 /美通社/ -- 2026年的招聘市場,正陷入一場奇特的"算法互博":求職者用AI美化簡歷以通過篩選,企業(yè)用AI深挖細(xì)節(jié)以識別真?zhèn)?。這場博弈的背后,是簡歷日益"豐滿...

關(guān)鍵字: AI 代碼 LAB 模型

當(dāng)?shù)貢r間 2 月 23 日,美股市場上演 AI 技術(shù)顛覆傳統(tǒng)產(chǎn)業(yè)的劇烈一幕:人工智能公司 Anthropic 宣布旗下 Claude Code 產(chǎn)品新增 COBOL 編程語言現(xiàn)代化處理能力后,國際商業(yè)機(jī)器公司(IBM)股...

關(guān)鍵字: IBM Anthropic AI 編程

美國舊金山和中國蘇州2026年2月8日 /美通社/ -- 信達(dá)生物制藥集團(tuán)(香港聯(lián)交所股票代碼:01801),一家致力于研發(fā)、生產(chǎn)和銷售腫瘤、自身免疫、代謝、眼科等重大疾病領(lǐng)域創(chuàng)新藥物的生物制藥公司,宣布與禮來制藥達(dá)成戰(zhàn)...

關(guān)鍵字: COM 代碼 創(chuàng)始人 控制

香港2026年2月4日 /美通社/ -- 華欽科技集團(tuán)(納斯達(dá)克代碼:CLPS,以下簡稱"華欽科技"或"集團(tuán)")今日宣布其董事會已通過一項(xiàng)集團(tuán)股份回購計劃的決議。該決議聲明,當(dāng)集團(tuán)股價低于每股2美元時,集團(tuán)可在公開市場上...

關(guān)鍵字: PS BSP 代碼 納斯達(dá)克

-Basecamp Research推出全球首個可編程基因插入AI模型 此突破可解決遺傳醫(yī)學(xué)長期存在的挑戰(zhàn),目標(biāo)是開發(fā)新一代治愈性細(xì)胞和基因療法。 與NVIDIA合作開發(fā),依靠NVIDIA BioNeMo的加...

關(guān)鍵字: 編程 SE AI模型 RESEARCH

在C語言編程中,循環(huán)結(jié)構(gòu)是處理重復(fù)任務(wù)的核心工具,而break和continue則是控制循環(huán)流程的關(guān)鍵指令。雖然兩者都用于改變循環(huán)的正常執(zhí)行路徑,但它們的行為和適用場景存在本質(zhì)差異。

關(guān)鍵字: C語言 編程

香港2025年12月11日 /美通社/ -- 諾亞控股有限公司(Noah Holdings Limited,以下簡稱"諾亞"或"公司",紐交所代碼:NOAH,港交所代碼:6686)...

關(guān)鍵字: AI 代碼 AN 操作系統(tǒng)

弗吉尼亞州阿什本2025年12月10日 /美通社/ -- 企業(yè)技術(shù)與創(chuàng)新領(lǐng)域的領(lǐng)先合作伙伴DXC Technology(紐約證券交易所代碼:DXC)今日宣布推出AdvisoryX,這是一支旨在幫助企業(yè)應(yīng)對最復(fù)雜的戰(zhàn)略、運(yùn)...

關(guān)鍵字: ADVISOR AI TECHNOLOGY 代碼

新加坡2025年12月8日 /美通社/ -- 近日,51Talk在線教育集團(tuán)("51Talk"或"公司")(紐約證券交易所美國股票代碼:COE)公布了其截至2025年9月...

關(guān)鍵字: BSP 代碼 創(chuàng)始人 新加坡

濟(jì)南2025年12月2日 /美通社/ -- 2025年11月30日,第三屆山東省青少年無人機(jī)大賽泰安區(qū)域選拔賽在浪潮探索中心泰安科創(chuàng)教育基地舉行。泰安市科協(xié)、泰山區(qū)科協(xié)、山東省無人機(jī)技術(shù)與應(yīng)用協(xié)會、山東浪潮盛華智慧教育有...

關(guān)鍵字: 大賽 無人機(jī) 人工智能 編程
關(guān)閉