C語言開發過程中容易碰到的記憶體相關錯誤

2022-01-23 18:06:55 字數 1302 閱讀 6667

在記憶體受限的嵌入式開發中,經常會碰到各種各樣的記憶體錯誤,若是在沒有記憶體保護的系統來說,出現記憶體相關的錯誤造成的結果可能是系統崩潰或造成重要資料的丟失。在開發嵌入式系統中關注穩定性特別重要。本篇文章主要收集和整理了記憶體相關錯誤,用以備忘。

ecos各個執行緒的堆疊由執行緒初始化時確認,如果函式內呼叫了過大的區域性變數,或者函式呼叫棧太深導致棧溢位。

c語言中涉及到強制指標取結構體訪問的時候由於結構體可能位元組未對齊造成指令呼叫訪問出錯。

大小端問題容易出現在網路程式設計相關裡,一般網路位元組序為大端。在嵌入式系統中,系統可能是大端也可能是小端。

需要注意這一點。

函式內部定義或者初始化的區域性變數位址不可返回。

某些庫或者第三方**可能會使用自有的malloc以及free函式,在新增新**時,需要注意統一的分配與釋放操作。

在操作指標運算時,需要留意可能容易混淆的地方,例如:int *p=**; p+1等於(size_t)p + 1,實際上 p + n

相當於(size_t)p + n * sizeof(*p),指標相關的加減操作與該指標指向的變數結構高度相關。

當引用區域性臨時變數時,容易忘記初始化該變數的記憶體空間。直接使用會有出錯的風險,特別是在迴圈利用buffer進行資料處理的時候。

訪問乙個已經被釋放(且置null)的指標通常會導致程式崩潰或者其它未知的錯誤,不同系統對訪問0,具有不同的含義。嵌入式系統中可能對0有特殊的含義。

當呼叫free函式時,該指標並不會被顯式的置為0,而是被記憶體管理模組標記該記憶體空間為可用狀態。仍然可用繼續訪問該記憶體空間,但是此時已經埋下了程式崩潰的隱患。

最常見的記憶體問題,申請了記憶體空間,由於邏輯問題或者其它問題造成該處記憶體丟失管理(即無人釋放),對於記憶體有限的嵌入式裝置來說,一定量的記憶體洩漏會引起系統執行不穩定。

當記憶體出現越界讀時,可能會導致資料錯誤,例如:如果讀取的空間超過了界限,無法保證字串以0結尾,當該資料傳遞給其它函式時,可能會引起不可預料的後果。如果出現了越界寫,

則會出現隨機的踩記憶體問題,這種問題往往難以定位。所以在開發時,需要時刻保證記憶體的邊界是否可控。

當源與目的直接進行資料拷貝時,可能由於位址的重疊造成未知的錯誤。

gcc 工具

windows

cppcheck靜態分析

以上每一點都可以展開來講,其中還有很多細節或者其它需要注意的問題都需要記錄,待續。

開發過程中錯誤總結

1 18年5月28日 說明是.xml檔案的問題。去上.xml排查,看是不是註解。或者檔案本身書寫有誤。2 linux下 webstorm,ppt,wps不能書寫漢字。在啟動檔案中修改 啟動 sudo sh webstorm.sh export xmodifiers im fcitx export q...

hive sql 開發過程碰到的問題

1.line 19 106 invalid table alias or column reference t distribute by 經常和 sort by 配合使用 但是distribute by後面的引數不能用table的別名.欄位,只能用單獨的欄位名。2.column repeated ...

C 開發過程中,遇到問題

在c 中,值型別不能為空。根據定義,值型別有乙個值,甚至值型別的未初始化變數也必須有乙個值。這稱為該型別的預設值。這將導致在檢查變數是否未初始化時引發異常 point 提供有序的 x 座標和 y 座標整數對,該座標對在二維平面中定義乙個點。pen 定義用於繪製直線和曲線的物件。此類不能被繼承。cla...