Problem description
unsigned char key[16] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01};
unsigned char in[16] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01};
unsigned char out[16];
int outlen ;
int ret ;
ret = aes_decrypt_ecb(key, sizeof(key), in, sizeof(in), out, &outlen);
我在除錯一個AES解密函式時,發現了一個詭異的現象,輸出的指標引數out的參考值不正確,并且報錯ret ≠ 0,但是我在呼叫這個函式之前,先呼叫一下其它函式,這樣就正確且出來的值就正確了,
- -, (Why?Why!Why!!)
Debug

F7、F8逐步定位出問題,區域變數未初始化導致,未初始化的變數隨機的分配第一個地址,地址是0,比較小,就報錯了,但是如果呼叫一下別的函式,堆疊里面就存了上一個函式留著的值未清除,然后剛好分配到這個污染的地址,就偶然的獲得了一個比較大的值,就陰差陽錯的讓程式跑下去了,
Solution
unsigned char key[16] = {0x9a, 0x53, 0x6a, 0x10, 0xaf, 0x85, 0x93, 0xbd, 0x79, 0x67, 0xd4, 0x19, 0xc4, 0x2b, 0x5e,
0xe0};
unsigned char in[16] = {0x5A, 0x9A, 0x48, 0x85, 0xD4, 0xF3, 0xBE, 0x60, 0x00, 0x47, 0x98, 0xC5, 0x82, 0x72, 0xD3,
0x2F};
unsigned char out[16] = {0}; // variable without initialization
int outlen = 16; // variable without initialization
int ret = 0; // variable without initialization
printf(" outlen: %d \n", outlen);
ret = aes_decrypt_ecb(key, sizeof(key), in, sizeof(in), out, &outlen);
Inspiration for me
How to locate the program problem?
- 有錯誤回傳值,就查看錯誤回傳值出現地方,查看什么條件下會觸發這個錯誤回傳值;
- 必須養成遇到問題就要形成反射出這個思維,查看輸入變數和輸出變數的關系,斷點逐步跟進呼叫別人的函式,查看別人的邏輯,
- 總結就是:遇事就斷點除錯!不要慌,
Must remember
The value must be initialized when creating a variable.
Reference
c語言中未初始化變數的后果
https://blog.csdn.net/Congwei12138/article/details/108274792
區域變數存放在堆疊空間,這個區域變數所在的函式被多次呼叫時,每次呼叫這個區域變數在堆疊上的位置都不一定相同,不過,區域變數也可以在堆上動態分配,但是要記得使用完這個堆空間后要釋放掉,全域變數存放在靜態存盤區,在程式開始執行時給全域變數分配存盤區,每次在程式行完畢就釋放,在程式執行程序中它們占據固定的存盤單元,而不動態地進行分配和釋放,
Github:https://github.com/Mysticbinary
既然看到了這里,君何不暢談一番?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/545704.html
標籤:其他
上一篇:Redis分布式鎖常見坑點分析
下一篇:C++時間對秒數的運算
