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語言記憶體
- 【JVM故障問題排查心得】「記憶體診斷系列」JVM記憶體與Kubernetes中pod的記憶體、容器的記憶體不一致所引發的OOMKilled問題總結(上)JVM記憶體OOM
- 【JVM故障問題排查心得】「記憶體診斷系列」JVM記憶體與Kubernetes中pod的記憶體、容器的記憶體不一致所引發的OOMKilled問題總結(下)JVM記憶體OOM
- C語言-記憶體函式的實現(二)之memmoveC語言記憶體函式
- C語言-記憶體函式的實現(一)之memcpyC語言記憶體函式memcpy
- Java記憶體模型FAQ(二) 其他語言,像C++,也有記憶體模型嗎?Java記憶體模型C++
- Swift 5強制獨佔記憶體Swift記憶體
- Swift 5將強制執行記憶體獨佔訪問Swift記憶體
- Rust語言記憶體管理之妙Rust記憶體
- C語言進位制轉換與列印C語言
- 主元素問題(C語言)C語言
- 第1天 C語言Dev-Cpp環境搭建及使用、C語言記憶體四區C語言dev記憶體
- C語言函式傳遞指標引數的問題詳解C語言函式指標
- C語言記憶體洩露很嚴重,如何應對?C語言記憶體洩露
- C結構體中資料的記憶體對齊問題結構體記憶體
- 記憶體管理機制的發展記憶體
- C語言訪問資料物件在記憶體中真實位模式的一個方法C語言物件記憶體模式
- Objective-C中的記憶體管理機制Object記憶體
- 排查Java的記憶體問題Java記憶體
- 圖解Go語言記憶體分配圖解Go記憶體
- 01-0006 C++記憶體訪問越界 [問題整理]C++記憶體
- 從問題到程式 程式設計與C語言引論pdf程式設計C語言
- C語言解決排序問題C語言排序
- 從記憶體洩露、記憶體溢位和堆外記憶體,JVM優化引數配置引數記憶體洩露記憶體溢位JVM優化
- Linux下C語言編譯的問題LinuxC語言編譯
- C語言細節 儲存類別,連結,記憶體管理C語言記憶體
- C語言記憶體管理,分配、使用、釋放以及安全性C語言記憶體
- V8引擎的JavaScript記憶體機制JavaScript記憶體
- C語言加強C語言
- Go 語言社群新提案 arena,可優化記憶體分配Go優化記憶體
- 刷題記錄(C語言)01C語言
- SQLServer記憶體問題分析SQLServer記憶體
- 探究 iOS 記憶體問題iOS記憶體