-
-
[讨论]用sscanf()把十六进制字符串转化成数值可能导致的溢出问题
-
发表于:
2008-11-15 21:22
12268
-
[讨论]用sscanf()把十六进制字符串转化成数值可能导致的溢出问题
main()
{
unsigned char s[]="DEADBEEF";
unsigned char *p;
int n, i;
n = strlen(s)/2;
p = (unsigned char *)malloc(n);
for(i=0; i<n; i++)
sscanf(s, "%02X", &p[i]);
/* 使用数组p */
free(p); /* 这里产生异常,因为内存块被破坏 */
}
跟踪了一下发现,"%02X"这个格式转化出来的值的类型是int,
而且它会把后面的变量当成int来处理,但是
在VC++中,长度为4个字节,而不是1个字节。假定p=1000,
于是在循环过程中,p所指的内存块发生如下变化:
+1000 0xDE
+1001 0x00
+1002 0x00
+1003 0x00 第1次循环时,实际上4个字节都被赋值
+1001 0xAD
+1002 0x00
+1003 0x00
+1004 0x00 第2次循环时,地址1004中的内容被破坏,该地址不在所分配的内存范围内
+1002 0xBE
+1003 0x00
+1004 0x00
+1005 0x00 第3次循环时,地址1005中的内容被破坏,该地址不在所分配的内存范围内
+1003 0xEF
+1004 0x00
+1005 0x00
+1006 0x00 第4次循环时,地址1006中的内容被破坏,该地址不在所分配的内存范围内
所以,整个循环完成后,有3个字节的内存单元被破坏。
如果一定要用sscanf()来转化的话,又不用中间变量的话,有没有什么办法?
格式中我找了一下只有"%02hX",这个短整型,也没有用。
实在不能用sscanf()的话,有没有其它替代函数?不想自己编函数来实现。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课