c語言強制記憶體轉化引發的問題
問題描述
在最近計算機網路的實驗中,構造IP資料包時使用了C語言的強制記憶體轉化,最終的程式出現了一個bug:
char* sendBuffer = (char*)malloc(37 * sizeof(char));
((uint16_t*)sendBuffer)[1] = 37; //0x25
sendBuffer | sendBuffer + 1 | sendBuffer + 2 | sendBuffer + 3 |
---|
程式本身期望使用((uint16_t*)sendBuffer)[1]
將sendBuffer + 2
與 sendBuffer + 3
的兩個連續位元組作為一個整體訪問,使其中的內容被改寫為0x0025
,但實際上被改寫為了0x2500
。
問題分析
在經過實驗後發現,即使進行了了強制型別轉換,將char*
轉為了uint16_t*
,使用((uint16_t*)sendBuffer)[1]
也不能將sendBuffer + 2
與 sendBuffer + 3
並不能作為作為一個整體訪問,依然會按照sendBuffer
宣告時的char*
型別將sendBuffer + 2
與 sendBuffer + 3
作為兩個位元組進行處理。
37
被解釋為0x0025,由於小端機的緣故,數字邏輯低位0x25
儲存在記憶體的物理低位sendBuffer + 2
,數字的邏輯高位0x00
儲存在記憶體的物理高位sendBuffer + 3
,造成了最終結果為0x2500
,而不是期望的0x0025
。
驗證
為了驗證上述想法,測試如下程式碼
unsigned short ch[20];
((unsigned int*)ch)[0] = 0x12345678;
unsigned short
佔2位元組,unsigned int
佔4位元組
按照上面的分析,(unsigned int*)ch[0]
不能將前4個位元組作為一個整體訪問,而是會按照陣列ch
宣告中的unsigned short
,將前4個位元組分為兩個2位元組處理。
執行結果如下:
前4個位元組被改寫為了0x 5678 1234
,而不是0x 1234 5678
。結合上面所述的小端機的原因,可知道這4個位元組確實是分成了兩個2位元組處理,而不是作為一個4位元組整體。我們的分析是正確的。
相關文章
- C 語言結構體記憶體佈局問題結構體記憶體
- C語言結構體記憶體佈局問題C語言結構體記憶體
- C語言的記憶體分配C語言記憶體
- C語言-記憶體分配C語言記憶體
- C語言:記憶體使用C語言記憶體
- C語言記憶體對齊C語言記憶體
- C語言-記憶體管理之一[記憶體分配]C語言記憶體
- C語言-記憶體管理之二[記憶體指令]C語言記憶體
- C語言(動態記憶體分配)C語言記憶體
- C語言記憶體地址基礎C語言記憶體
- C 語言常見問題(轉)
- 【C語言】整型在記憶體中的儲存C語言記憶體
- C語言:記憶體位元組對齊詳解C語言記憶體
- Go語言記憶體模型Go記憶體模型
- C/C++記憶體釋放應注意的問題C++記憶體
- Swift 5強制獨佔記憶體Swift記憶體
- Android NDK開發之旅3 C語言基礎 記憶體分配AndroidC語言記憶體
- Java記憶體模型FAQ(二) 其他語言,像C++,也有記憶體模型嗎?Java記憶體模型C++
- C語言-記憶體函式的實現(一)之memcpyC語言記憶體函式memcpy
- C語言-記憶體函式的實現(二)之memmoveC語言記憶體函式
- Go 語言的手工記憶體管理Go記憶體
- Swift 5將強制執行記憶體獨佔訪問Swift記憶體
- 嵌入式C語言強化筆記--__I、 __O 、__IOC語言筆記
- 系統對不同語言的程式有不同記憶體管理機制?記憶體
- 【JVM故障問題排查心得】「記憶體診斷系列」JVM記憶體與Kubernetes中pod的記憶體、容器的記憶體不一致所引發的OOMKilled問題總結(上)JVM記憶體OOM
- 【JVM故障問題排查心得】「記憶體診斷系列」JVM記憶體與Kubernetes中pod的記憶體、容器的記憶體不一致所引發的OOMKilled問題總結(下)JVM記憶體OOM
- 關於c語言記憶體分配,malloc,free,和段錯誤,記憶體洩露C語言記憶體洩露
- 求助(請教C語言編譯問題)(轉)C語言編譯
- Rust語言記憶體管理之妙Rust記憶體
- C結構體中資料的記憶體對齊問題結構體記憶體
- 系統對不同語言程式有不同記憶體管理機制?記憶體
- 記憶體管理機制的發展記憶體
- 主元素問題(C語言)C語言
- 第1天 C語言Dev-Cpp環境搭建及使用、C語言記憶體四區C語言dev記憶體
- 【c++】vector.clear()的記憶體洩露問題C++記憶體洩露
- 遊戲設計如何解決“去個性化”引發的遊戲言語暴力問題?遊戲設計
- C語言記憶體洩露很嚴重,如何應對?C語言記憶體洩露
- C語言malloc()函式:動態分配記憶體空間C語言函式記憶體