设为首页 加入收藏

TOP

Problems caused by variable without initialization value
2023-07-23 13:36:57 】 浏览:32
Tags:Problems caused variable without initialization value

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?

  • 有错误返回值,就查看错误返回值出现地方,查看什么条件下会触发这个错误返回值;
  • 必须养成遇到问题就要形成反射出这个思维,查看输入变量和输出变量的关系,断点逐步跟进调用别人的函数,查看别人的逻辑。
  • 总结就是:遇事就断点调试!不要慌。

Summary

When writing C language, it is necessary to remember.
The value must be initialized when creating a variable.

Reference

c语言中未初始化变量的后果
https://blog.csdn.net/Congwei12138/article/details/108274792

Notice

  • 局部变量存放在栈空间,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。不过,局部变量也可以在堆上动态分配,但是要记得使用完这个堆空间后要释放掉。

  • 全局变量存放在静态存储区,在程序开始执行时给全局变量分配存储区,每次在程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++时间对秒数的运算 下一篇双指针

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目