Problem description unsigned char key[16] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}; unsigned ...
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
既然看到了這裡,君何不暢談一番?