数据离奇消失bug------栈覆盖

大耗子 2021年01月20日 71次浏览
  • 工作中遇到的bug,当时写了一块内存后,其他内存的数据消失了,百思不得其解,后来想到会不会是栈内存覆盖,一看还真是。于是就有了这篇文章。

  • 在通过栈申请的内存有一个特点,他是连续的,这就很容易造成一个现象,如果出现栈溢出问题,会覆盖写掉其他变量的东西。比如我下面写的例子。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char bigmem[50] = {0};

void main()
{
	char ip[20] = "192.168.40.1";
	char flag = 1;
	char md5[32] = "abc654377afeeeeeee231231231232";
	printf("ip:%p md5:%p flag:%p\n",ip,md5,&flag);
	printf("before ip:%s md5:%s flag:%d\n",ip, md5, flag);
	memcpy(ip,bigmem,sizeof(bigmem));

	printf("after ip:%s md5:%s flag:%d\n",ip, md5, flag);
}

  • 通过运行,本来是要给ip数组写入东西,但是由于写入的数据超过了ip数组的大小,导致栈溢出,写到了后面的内存上,导致覆盖了MD5数组的内存上,引起了md5打印为空的现象。而flag变量由于地址在ip的前面,所以没有被覆写。
  • 运行结果:
ip:0x7fffed6d2800 md5:0x7fffed6d2820 flag:0x7fffed6d27ff
before ip:192.168.40.1 md5:abc654377afeeeeeee231231231232 flag:1
after ip: md5: flag:1