成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

代碼防御性編程的十條技巧

開發 前端 新聞
顧名思義,防御性編程是一種細致、謹慎的編程方法。為了開發可靠的軟件,我們要設計系統中的每個組件,以使其盡可能的”保護”自己。我們通過明確地在代碼中對設想進行檢查,這是一種努力,防止我們的代碼以將會展現錯誤行為的方式被調用。

 

1 什么是防御性編程?

顧名思義,防御性編程是一種細致、謹慎的編程方法。為了開發可靠的軟件,我們要設計系統中的每個組件,以使其盡可能的”保護”自己。我們通過明確地在代碼中對設想進行檢查,這是一種努力,防止我們的代碼以將會展現錯誤行為的方式被調用。

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

代碼防御性編程的十條技巧

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

反對者:

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

支持者:

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

防御性編程技巧

  1. 使用好的編碼風格和合理的設計

采用良好的編碼風格,來防范大多數編碼錯誤。如:

  • const關鍵字:

關鍵字const可以給讀你代碼的人傳達非常有用的信息。例如,在函數的形參前添加const關鍵字意味著這個參數在函數體內不會被修改,屬于輸入參數。

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

  • volatile關鍵字:

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

  • static關鍵字:
  1. 函數體內static變量的作用范圍為該函數體,不同于auto變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值。
  2. 在模塊內的static全局變量可以被模塊內的所有函數訪問,但不能被模塊外其它函數訪問。
  3. 在模塊內的static函數只可能被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模塊內。
  • 位操作運算中,盡可能使用<<、 >>、 &、|等運算符,盡可能少使用/、%、*運算符。
  • 變量和函數的命名要有意義,并且盡可能做到一個函數只做一件事情。
  • 多采用面向對象的思想來編寫代碼。
  • 在投入到編碼工作之前,先考慮大體的設計方案,這也非常關鍵。
  1. 不要倉促的編寫代碼

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

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

  1. 不要相信任何人

這里是指用懷疑的眼光來審視所有的輸入和所有的結果,直到你能證明這段代碼是正確的時候為止。

  1. 編碼的目標要清晰,而不是簡潔

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

  1. 編譯時打開所有警告開關

在你的代碼中產生任何警告信息,都應立即修正代碼。要知道警告的出現總是有原因的。即使你認為某個警告無關緊要,也不要置之不理。

  1. 使用安全的數據結構

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

  1. char * unsafe_copy(const char * source) 
  2.    char *buffer = new char[10]; 
  3.    strcpy(buffer,source); 
  4.    return buffer; 

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

  1. char * safe_copy(const char * source) 
  2.    char *buffer = new char[10]; 
  3.    strncpy(buffer,source,10);  //用strncpy代替strcpy可以保護這個代碼段 
  4.    return buffer; 
  1. 檢查所有的返回值

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

  1. 審慎的處理內存

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

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

如果你意外的使用了一個沒有初始化的變量,那么你的程序在每次運行的時候都將得到不同的結果,這取決于當時內存中的垃圾信息是什么。這樣會造成很多隨機的行為,給查找帶來很多的麻煩。因此,需要在聲明每個變量的時候就對它進行初始化。

  1. 同時,平時編碼時還要注意一些細則
  • 提供默認的行為:Switch語句中將default case的執行明示出來。同樣地,如果你要編寫一些不帶else子句的if語句,停下來想一想,你是否該處理這個邏輯上的默認情況
  • 檢查數值的上下限:確保每次運算數值變量都不會溢出,即數據類型的使用要謹慎
  • 注意強制轉換是否合理
  • 聲明變量,可以使變量的聲明位置與使用它的位置盡量接近,從而防止它干擾代碼的其他部分
  • 加合理的異常處理、日志文件
  • 正確設置常量

優秀的程序應該做到:

  • 關心代碼是否健壯
  • 確保每個設想都顯示地體現在防御性代碼中
  • 希望代碼對無用信息的輸入有正確的行為
  • 在編程的時候認真思考自己所編寫的代碼
  • 編寫可以保護自己不受其他人的愚蠢傷害的代碼。

 

責任編輯:張燕妮 來源: 今日頭條
相關推薦

2023-12-15 08:17:13

防御性編程代碼

2012-05-15 01:38:18

編程編程技巧編程觀點

2022-03-11 07:47:56

防御性編程互聯網

2022-04-26 06:21:59

編程動態內存

2024-10-09 12:03:06

2024-07-26 10:01:16

2012-08-02 09:14:13

編程戒律

2011-05-30 15:59:47

編程

2023-09-27 22:52:52

2012-03-06 16:01:04

項目管理

2022-05-07 19:18:16

防御性編碼代碼

2023-12-12 13:18:11

2023-12-12 09:27:07

編程碼農

2025-05-26 10:25:00

防御性編程開發編程

2024-08-19 09:04:50

2024-02-19 14:50:42

編碼原則軟件開發

2024-11-28 11:34:54

2022-02-07 11:24:08

云安全云計算

2023-09-22 12:04:53

Java代碼

2025-05-21 00:10:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩高清三区 | 久久久久久av | av在线成人 | 国产欧美在线视频 | 成人欧美一区二区三区黑人孕妇 | 五月婷婷丁香 | 黄免费看| 欧美video | 亚洲欧美日韩中文字幕一区二区三区 | 久久精品中文字幕 | 久久久精品一区二区三区 | 在线午夜 | 日韩二区三区 | 日本精品一区二区三区四区 | 中文字幕一级毛片 | 精品欧美一区二区精品久久 | 一区二区三区四区在线播放 | 亚洲欧美一区二区在线观看 | 精品国产青草久久久久96 | 久久精品二区 | 精品日韩在线 | 精品视频在线观看 | 亚洲97 | 久久精品亚洲精品 | 国产精品精品视频一区二区三区 | 成人免费毛片在线观看 | 99re视频 | 天天综合成人网 | 国产一区二区三区免费 | 国产精品一区二区av | 国产欧美精品一区 | 99精品国产一区二区三区 | 亚洲欧美高清 | 国产伦一区二区三区视频 | 噜噜噜噜狠狠狠7777视频 | 在线观看av不卡 | 一区二区三区四区在线 | 国产2区| 久久久91精品国产一区二区精品 | 一区精品在线观看 | 成人欧美一区二区三区黑人孕妇 |