您好,登錄后才能下訂單哦!
本篇內容主要講解“python代碼防御性編程的技巧有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“python代碼防御性編程的技巧有哪些”吧!
顧名思義,防御性編程是一種細致、謹慎的編程方法。為了開發可靠的軟件,我們要設計系統中的每個組件,以使其盡可能的”保護”自己。我們通過明確地在代碼中對設想進行檢查,這是一種努力,防止我們的代碼以將會展現錯誤行為的方式被調用。
防御性編程使我們可以盡早的發現較小的問題,而不是等到它們發展成大的災難的時候才發現。
下面總結了一些防御性編程的反對和支持者的意見:
反對者:
它降低了代碼的效;即使是一個很小的額外代碼也需要一些額外的執行時間。它對于一個函數來說也許不要緊,但是對于一個由10萬個函數組成的系統,問題就變得嚴重了。
每種防御性的做法都需要一些額外的工作;
支持者:
防御性編程可以節省大量的調試時間,使你可以去做更有意義的事情。
編寫可以正常運行、只是速度有些慢的代碼,要遠遠好過大多數時間都正常運行、但是有時候會崩潰的代碼。
防御性編程避免了大量的安全性問題。
使用好的編碼風格和合理的設計
采用良好的編碼風格,來防范大多數編碼錯誤。如:
const關鍵字:
關鍵字const可以給讀你代碼的人傳達非常有用的信息。例如,在函數的形參前添加const關鍵字意味著這個參數在函數體內不會被修改,屬于輸入參數。
同時,合理地使用關鍵字const可以使編譯器很自然的保護那些不希望被修改的參數,防止其被無意的代碼修改,減少bug的出現。
volatile關鍵字:
在一些并行設備的硬件寄存器(如狀態寄存器),中斷服務子程序中會訪問到的全局變量以及多線程應用中被幾個任務共享的變量前使用volatile關鍵字來防止編譯優化。
static關鍵字:
函數體內static變量的作用范圍為該函數體,不同于auto變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值。
在模塊內的static全局變量可以被模塊內的所有函數訪問,但不能被模塊外其它函數訪問。
在模塊內的static函數只可能被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模塊內。
位操作運算中,盡可能使用<<、 >>、 &、|等運算符,盡可能少使用/、%、*運算符。
變量和函數的命名要有意義,并且盡可能做到一個函數只做一件事情。
多采用面向對象的思想來編寫代碼。
在投入到編碼工作之前,先考慮大體的設計方案,這也非常關鍵。
不要倉促的編寫代碼
欲速則不達,每敲一個字,都要想清楚你要輸入的是什么。在寫每一行時都三思而后行。可能會出現什么樣的錯誤?你是否已經考慮了所有可能出現的邏輯分支?放慢速度,有條不紊的編程雖然看上去很平凡,但這的確是減少缺陷的好辦法。
如C語言編程中,追求速度的程序員經常會出現的一個問題就是將”==”錯誤的輸入為”=”,而有些編譯器并不會警告,這就會造成問題。
不要相信任何人
這里是指用懷疑的眼光來審視所有的輸入和所有的結果,直到你能證明這段代碼是正確的時候為止。
編碼的目標要清晰,而不是簡潔
簡單是一種美,不要讓你的代碼過于復雜。即編寫的代碼一定要邏輯清晰,可讀性強。
編譯時打開所有警告開關
在你的代碼中產生任何警告信息,都應立即修正代碼。要知道警告的出現總是有原因的。即使你認為某個警告無關緊要,也不要置之不理。
使用安全的數據結構
我們最常見的一些安全隱患大概是由緩沖溢出引起的。緩沖溢出是由于不正確的使用固定大小的數據結構而造成的。例如,如下這個代碼:
char * unsafe_copy(const char * source) { char *buffer = new char[10]; strcpy(buffer,source); return buffer; }
如果source中的數據長度超過10個字符,它就會造成其它問題。我們可以改成如下形式:
char * safe_copy(const char * source) { char *buffer = new char[10]; strncpy(buffer,source,10); //用strncpy代替strcpy可以保護這個代碼段 return buffer; }
檢查所有的返回值
如果一個函數返回一個值,他這樣做肯定是有理由的。檢查這個返回值,如果返回值是一個錯誤代碼,你就必須辨別這個代碼并處理所有的錯誤。不要讓錯誤悄無聲息的侵入你的程序;大多數難以察覺的錯誤都是因為程序員沒有檢查返回值而出現的。
審慎的處理內存
對于在執行期間所獲取的任何資源,必須徹底釋放。
在聲明位置初始化所有變量
如果你意外的使用了一個沒有初始化的變量,那么你的程序在每次運行的時候都將得到不同的結果,這取決于當時內存中的垃圾信息是什么。這樣會造成很多隨機的行為,給查找帶來很多的麻煩。因此,需要在聲明每個變量的時候就對它進行初始化。
同時,平時編碼時還要注意一些細則
提供默認的行為:Switch語句中將default case的執行明示出來。同樣地,如果你要編寫一些不帶else子句的if語句,停下來想一想,你是否該處理這個邏輯上的默認情況
檢查數值的上下限:確保每次運算數值變量都不會溢出,即數據類型的使用要謹慎
注意強制轉換是否合理
聲明變量,可以使變量的聲明位置與使用它的位置盡量接近,從而防止它干擾代碼的其他部分
加合理的異常處理、日志文件
正確設置常量
關心代碼是否健壯
確保每個設想都顯示地體現在防御性代碼中
希望代碼對無用信息的輸入有正確的行為
在編程的時候認真思考自己所編寫的代碼
編寫可以保護自己不受其他人的愚蠢傷害的代碼。
到此,相信大家對“python代碼防御性編程的技巧有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。