最近在看之前的**,對之前的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...