胖纸带你嘿嘿嘿

一个搞嵌入式开发的胖纸

BUG记录:sscanf()函数导致内存溢出,造成其他变量被改变

问题代码:

typedef union
{
	uint16_t Value16;
	uint8_t  Value8[2];
}PULSE;
PULSE MaxPowerOpt;
static char cSetValue[]="00.00";
sscanf(cSetValue,"%d",(int *)&MaxPowerOpt.Value16);

问题描述:

本来是希望通过sscanf()函数将字符串cSetValue转为无符号整数给MaxPowerOpt.Value16,但是发现每一次转换完成后,有一个变量(MutexSemaphore)的值都会被莫名其妙的修改为0,而且根据.map文件,这个被莫名其妙修改的变量(MutexSemaphore)被分配的地址刚好是在MaxPowerOpt的后面。

BUG记录:sscanf()函数导致内存溢出,造成其他变量被改变 嵌入式 第1张

后来我做了个实验,在sscanf()前后,分别查看了MaxPowerOpt及其后面地址的内容变化,实验代码如下:

p = &MaxPowerOpt.Value16;
printf("%d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4));
sscanf(cSetValue,"%d",(int *)&MaxPowerOpt.Value16);
printf("%d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4));

实验结果如下

BUG记录:sscanf()函数导致内存溢出,造成其他变量被改变 嵌入式 第2张

由此可见,sscanf()函数在转换时,出现了内存溢出的情况。

解决方案:

自行设计了字符串转整数的函数Str2Int(),具体实现的代码如下:

int Str2Int(char * str)
{
	int i=0;
	int j=0;
	while(str[j] != '\0')
	{
		i = i * 10 + str[j] - 0x30;
		j++;
	}
	return i;
}


  • 评论列表:

发表评论:

Powered By Z-BlogPHP 1.6.4 Valyria

Copyright itdoy . All Rights Reserved.备案号:琼ICP备15000663号-1