野指標問題

2021-08-15 03:30:28 字數 1600 閱讀 3859

最近在看之前的**,對之前的bug有些新的認識,這裡總結下,學疏才淺,跟大家分享下吧。

首先是用到了乙個傳送函式

static int send_fun(uint16_t length, uint8_t *data);
需要根據不同的條件判斷傳送的資料 data

以下實現是錯誤的

int judge_send_fun(void)

else if(***)

return ret;

}

錯誤的原因是函式中定於的uint8_t *data 是乙個野指標,在函式呼叫send_fun函式之前,會把judge_send_fun函式的區域性變數和靜態變數和跳轉回來的程式位置以及send_fun的引數進行壓棧(函式呼叫的實現可以看考《深入理解計算機系統》中的過程一節),這裡壓棧的只是乙個存放data的位址,當data的位址做為引數傳給send_fun時,只是傳遞了壓棧是的指向data的指標,實際上由於data在宣告時沒有指向具體的記憶體空間(野指標),data的內容是不可靠的值,及send_fun函式根據傳入的data的位址去尋找具體的數值時,得到的數值時乙個隨機的數字,導致程式執行錯誤。

正確的做法如下:

int judge_send_fun(void)

else if(***)

return ret;

}

這樣在呼叫send_fun之前被壓棧的是,data的數值和send_fun 引數&data,此時&data指向的位址,是被壓棧的data的數值,不會出現data的數值被隨機篡改的問題。

最近在開發過程中犯了同樣的錯誤,在這裡記錄下。

先貼下**

函式結構:

/* init structure */

typedef struct

mfrc631_structtypedef;

初始化函式

void mfrc631_init (mfrc631_structtypedef * mfrc631_initstruct)

具體的實現的功能這裡就不去介紹了,關鍵是要往模組裡註冊函式。

先說下錯誤的用法:

static mfrc631_structtypedef *mfrc631_handle;

static uint8_t nfc_version = 0;

static void nfc_device_mfrc631_init(void)

明顯可以看出和上面是同樣的問題, mfrc631_init(mfrc631_handle);傳入的mfrc631_handle是乙個沒有指向任何實際位址的指標(野指標),在編譯的時候並不會報錯,但是在板子上除錯的時候會觸發異常。

正確的用方法如下:

static mfrc631_structtypedef mfrc631_handle;

static uint8_t nfc_version = 0;

static void nfc_device_mfrc631_init(void)

野指標問題

關於這一點本來是不想寫的,一直覺的是些旁枝末葉的東西,很容易就能掌握,或者說不會犯錯的地方,但這兩天敲 的時候就遇到了這樣的問題,或者說不容易犯錯的地方才最容易犯錯吧!下面切入正題 何為野指標,對乙個指向空位址的指標我們將其稱為野指標,即所指向的位址不能進行操作的指標 這兩天寫c 的時候就遇到了這個...

野指標相關問題

最近在學習並行程式設計時注意到了uaf use after free 問題,引發uaf問題的原因一般是因為在釋放了某個指標指向的記憶體後,並沒有將該指標置空,從而可以通過該指標非法地修改記憶體。以前因為一直都沒有寫過大型專案,也不曾特別關心安全問題,雖然知道在指標申請後手動置為null但一度以為在f...

演算法筆記 野指標問題

野指標 乙個指標在free之後沒有被賦值成null。造成野指標的原因 在函式free p 中只是將p指標的值傳遞給了函式,僅僅是釋放了形參的值,實參的值並沒有改變,並且malloc函式在作業系統分配的時候是順序分配 比如釋放了的p原本使用的位址為2000,那麼下一次malloc分配的位址就是這個20...