軟體程式設計低階錯誤總結

2021-06-22 16:22:42 字數 3135 閱讀 7409

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

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

||

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

C 低階錯誤

1.陣列下標訪問越界 2.使用野指標 3.記憶體拷貝忽略字串結尾標誌 0 4.判斷無符號數是否小於0 5.迴圈變數資料型別太小 6.迴圈體內改寫迴圈變數 7.混淆 與 8.函式區域性變數或引數過大,堆疊溢位 9.資料型別不一致,變數或引數賦值出錯 10.分支流程未釋放動態申請的記憶體 案例 1 陣列...

order by asc低階錯誤

問題 查詢emp表,顯示部門號為10的所有雇員的name job sal和 deptno,並以工資公升序進行排序。14 30 24 sql select ename,job,sal,deptno from emp order by asc select ename,job,sal,deptno fr...

低階錯誤集合

1.檔名打錯 2018.10.11 t1 freopen forging r stdin freopen forging w stdout 看著好像沒什麼不對?freopen forging.in r stdin freopen forging.out w stdout 100分慘變0分 總分150...