軟件編程低級錯誤總結

通過對《常見軟件編程低級錯誤》資料的學習,瞭解到了編碼中容易出現錯誤的地方,並且對代碼編寫的要求有了更深的認識。文中對“好”代碼的要求是我們每個程序員應該達到的目標:“能工作的代碼並不等於‘好’代碼,‘好’代碼的指標很多,包括可讀性、可維護性、可移植性和可靠性等。出現網上問題的代碼,大多是不良編程習慣引起的,不遵守編程規範的代碼,往往也是最不可靠的代碼。”

1    1      內存泄露

1、函數的異常處理的出口,沒有釋放申請的資源。在函數return時,特別是包含有return的宏定義,一定要檢查前面有沒有申請資源,如果有申請則要考慮資源釋放的問題。

2、要刪除一個結構體指針時,要檢查一下結構體中是否還有指針申請了資源,如果有,則要由底至上一個個刪除。

3、數組中的元素如果有申請資源,在釋放數組時,要確保這些資源被全部釋放。

4、已經分配過內存的指針,在沒有釋放前,不能再次對其分配內存,尤其是代碼拷貝的時候要着重檢查。

5、判斷申請資源是否成功的條件語句,不要將多個條件或在一起,那樣無法判斷是由哪些申請資源成功,哪些申請失敗。儘量使用簡單的條件語句。

6、隊列刪除其中某個節點,要記得一起刪除該節點所申請的內存。

2    2      內存越界

1、定義一個數組時,一定要考慮到數組的最大情況,避免造成越界讀寫。

2、進行memset,memcpy操作時,長度要考慮到邊界,不能越界操作。

3、定義一個字符串時,要接上結束符’\0’,不然在計算該字符串長度時,會出現錯誤,進而導致該字符串的複製等操作越界。

4、指針的加減運算是根據指針類型進行指針的移動。

5、字符串,結構體等長度,要採用strlen,sizeof等函數來獲取,不要人工計算,避免人工計算的錯誤。

6、外部傳入函數的入參要進行判斷,入參異常,則返回,不執行後面的語句。

7、如果是一個指針變量,使用sizeof計算的是該指針的大小,而不是指針所指內容的大小。

8、儘量減少編譯開關,避免編譯開關選擇錯誤。

3    3      野指針

1、指針刪除時,要賦值爲NULL,其他地方調用該指針後出錯。

2、局部變量的使用,當函數執行結束後,局部變量的生命期結束,內存備釋放,此時其他函數不能繼續調用該變量。

3、函數返回值爲一個局部變量的指針,函數結束後該變量已經被釋放,該地址已經爲其他地方使用,不能繼續對該指針進行操作。

4、內存的重複釋放,每次釋放內存前,加入判斷,如果不爲空才釋放。並且內存的申請和釋放最好在同一個作用域裏。

4    4      雜項

1、變量溢出,對變量進行加減運算時,必須要考慮變量的類型,是否會產生溢出。

2、atoi,atol,atof函數內部都不檢測溢出,最好不使用此類危險函數。

3、參數的類型轉換時,要考慮是否會引起數據的截斷或改變。

4、定義類型衝突:變量在定義和extern時,類型要相同。

5、Memcpy時,先將目的地址的內存清0,防止有之前的數據。

6、字符串拷貝使用字符串專用的拷貝函數,以便維護人員理解

7、寄存器賦值時,未修改的BIT位要考慮是否需要清0.

8、棧大小的定義足夠實際的使用。

9、不使用超大臨時變量,這樣容易造成棧溢出

10、可以考慮用指針替換超大的臨時變量。

11、減少函數調用層次,慎用遞歸函數。

12、多任務操作全局變量或鏈表等數據結構時,要加上保護。

13、子進程如果不需要父進程的資源,要立刻將其關閉

5    5      變量

1  指針變量沒有使用時,初始化要爲NULL,不要初始化爲其他數字。

2  確保所有的條件分支不遺漏變量的初始化。

3、  結構體的初始化,要包含所有的成員。

4  數組的初始化要包含所有的元素,使用正確的函數計算數組長度。

5  局部變量命名不能和成員變量,全局變量重名。

6  全局變量的初始化,要考慮初始化的順序。

7  使用全局變量和初始化全局變量兩者之間的時序關係要考慮清楚。

6    6      表達式

1  表達式中有多種運算符,要用括號控制計算的次序。

2  表達式使用默認優先級時,要考慮各種運算符優先級高低

3  函數的入參不要使用表達式。

4  ++--等運算最好是單獨使用一個表達式。

5  Volatile變量運算結果不是預期值,是因爲該變量可能被其他程序或硬件改變。

6  表達式中的嵌套語句,可能導致某些變量被多次賦值

7    7      空指針

1  內存申請後,要判斷是否申請成功,要考慮異常分支的處理。

2  外部入參傳入的參數或是全局變量指針,要判斷是否合法。

3  外部接口傳入的指針使用前必須判斷是否合法。

4  判斷多個指針是否爲空時,要分開判斷,不要使用一條判斷語句。

5  ||條件判斷中,左邊的表達式成立,則不會繼續判斷右邊的了,如果右邊有計算則不會執行

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章