程式設計常見錯誤TOP10
結合以前工作經驗,整理的編碼常見的錯誤、推薦風格,及原因:
程式設計常見錯誤TOP10:
-
返回值使用錯誤
-
呼叫函式的執行結果對流程有影響,卻未判斷返回值的
-
返回值使用不準確
-
返回值的巨集和判斷的巨集不是同一套
-
錯誤的型別轉換,返回值型別和賦值變數型別不一致
-
-
-
斷言的使用
-
在可能出現的位置使用斷言
-
-
系統資源使用
-
資源的申請和釋放不在同一層次。
-
資源的malloc和free要在同一個if/while/for的層次內,這樣邏輯清晰,走查的時候好判斷是否有釋放。也不容易遺漏。
-
-
成對的系統資源操作之間異常退出。成對的malloc/free spin_lock/spin_unlock fopen/fclose之間,不允許有return操作。成對的資源申請、釋放之間如果有return語句,需要在return之前釋放資源,如果有多個資源、多個return的組合,需要考慮每個return時需要釋放的資源,複雜度很高、維護難度大。因此,不建議使用return,可以用ulRet記錄返回狀態,只有在操作成功時才進行後續操作,在程式結尾同一進行return
-
過早進行資源申請導致不必要的回退或資源洩露。如果需要入口條件滿足才進行後續處理,應該先判斷入口條件再進行資源申請。
-
資源直接賦值給間接變數。間接變數包括:結構體欄位,多級指標,全域性變數。資源malloc等,要避免直接賦值給間接變數。原因包括:1、pclint等程式碼檢查工具無法追蹤間接變數,直接賦值會導致工具無法檢測到資源洩露等問題。2、全域性變數等可能有併發使用,直接賦值可能存在賦值和初始化之間被排程時,訪問未初始化的資源
-
-
記憶體釋放
-
錯誤的函式釋放
-
記憶體釋放函式和申請函式要配套,自定義的結構如果有封裝申請函式要使用對應的釋放函式釋放所有資源。
-
-
釋放非法地址、重複釋放、釋放後再使用記憶體
-
釋放記憶體前未從結構上摘除
-
記憶體洩露、未第一時間釋放資源
-
-
記憶體越界
-
字串、記憶體拷貝、清零操作越界
-
緩衝區太小越界
-
非法引數未檢查導致越界
-
-
空野指標
-
釋放全域性變數資源後未清零變數
-
釋放結構體掛接的記憶體後,未清零欄位
-
訪問空指標
-
-
未初始化
-
變數未初始化
-
資料結構欄位未初始化
-
動態記憶體未初始化
理論上所有的變數記憶體資料結構都需要進行初始化,初始化值一般是0,如果初始化值非0在memset後需要手動賦值初始化值
-
-
程式碼冗餘
-
類似的大段程式碼,如果有邏輯功能相同的大段程式碼,需要封裝成函式,而不是ctrl c複製修改,大量重複程式碼導致這段邏輯修改時,需要修改大量的地方,工作量大且容易出錯,維護成本高
-
反覆多重間接定址。特別是在迴圈操作中有大量-> . 等間接定址的操作,會較大的影響效能,建議使用區域性變數儲存定址後的值,在迴圈中直接使用。
-
為處理不可能事件引入虛假分支。
-
無必要的記憶體拷貝
-
無必要的申請靜態、動態記憶體
-
臨時使用小記憶體時,申請動態記憶體。一般小記憶體的概念是小於256byte的記憶體。
-
-
程式設計介面
-
模組或驅動介面使用錯誤
-
-
資源型介面設計
-
釋放參數攜帶的資源時規則不一致,要麼內部釋放要麼外部釋放,不能有同時存在的情況,否則容易使用出錯
-
複合資源申請釋放未封裝或封裝不對稱。如果一個結構體內包含其他記憶體申請等資源組合成複合資源,需要封裝對應的申請、釋放函式,統一申請、釋放全部資源。後續對該資源的申請釋放通過封裝的介面來操作。
-
資源建立、獲取函式未將資源作為返回值而是引數。資源建立的函式理論上和malloc等類似,建議申請成功返回資源,申請失敗返回NULL。不建議將資源通過指標返回。
-