VS2010,scanf,奇怪的行为
我正在将一些源代码从VC6转换为VS2010。代码是用C++/CLI编写的,它是一个MFC应用程序。它包括一行:VS2010,scanf,奇怪的行为,c,visual-studio-2010,scanf,C,Visual Studio 2010,Scanf,我正在将一些源代码从VC6转换为VS2010。代码是用C++/CLI编写的,它是一个MFC应用程序。它包括一行: BYTE mybyte; sscanf(source, "%x", &mybyte); 这对于VC6来说很好(超过15年),但在VS2010中会造成问题,所以我创建了一些测试代码 void test_WORD_scanf() { char *source = "0xaa"; char *format = "%x"; int result = 0;
BYTE mybyte;
sscanf(source, "%x", &mybyte);
这对于VC6来说很好(超过15年),但在VS2010中会造成问题,所以我创建了一些测试代码
void test_WORD_scanf()
{
char *source = "0xaa";
char *format = "%x";
int result = 0;
try
{
WORD pre = -1;
WORD target = -1;
WORD post = -1;
printf("Test (pre scan): stack: pre=%04x, target=%04x, post=%04x, sourse='%s', format='%s'\n", pre, target, post, source, format);
result = sscanf(source, format, &target);
printf("Test (post scan): stack: pre=%04x, target=%04x, post=%04x, sourse='%s', format='%s'\n", pre, target, post, source, format);
printf("result=%x", result);
// modification suggested by Werner Henze.
printf("&pre=%x sizeof(pre)=%x, &target=%x, sizeof(target)=%x, &post=%x, sizeof(post)=%d\n", &pre, sizeof(pre), &target, sizeof(target), &post, sizeof(post));
}
catch (...)
{
printf("Exception: Bad luck!\n");
}
}
构建这个(在调试模式下)没有问题。运行它会产生奇怪的结果,我无法解释。首先,我按照预期从两个printf statemens获取输出。然后是运行时警告,这对我来说是意想不到的
Test (pre scan): stack: pre=ffff, target=ffff, post=ffff, source='0xaa', format='%x'
Test (post scan): stack: pre=ffff, target=00aa, post=ffff, source='0xaa', format='%x'
result=1
Run-Time Check Failure #2 - Stack around the variable 'target' was corrupted.
使用调试器,我发现从函数返回时会触发运行时检查失败。有人知道运行时检查失败的原因吗?我用过谷歌,但找不到任何建议
在实际代码中,sscanf中使用的不是一个字,而是一个字节(我有一个字节版本的测试函数)。这导致了“%x”格式的实际堆栈损坏(用0覆盖变量pre),而使用“%hx”(我希望是正确的格式)仍然会在覆盖变量prev的较低字节时造成一些问题
欢迎提出任何建议
注意:我编辑了示例代码以包含来自sscanf()的返回结果
亲切问候,
Andre Steenveld.
sscanf
带%x
。如果提供了字节
或字
的地址,则会出现缓冲区溢出/堆栈覆盖<代码>%hx将显示
解决方案是使用一个int变量,让sscanf
写入该变量,然后将WORD
或BYTE
变量设置为读取值
int x;
sscanf("%x", "0xaa", x);
BYTE b = (BYTE)x;
顺便说一句,为了你的测试和信息
运行时检查失败#2-变量“target”周围的堆栈已损坏
您还应该打印出变量的地址,您可能会看到编译器在变量pre/target/post之间添加了一些填充/安全检查空间。解决了问题。我假设sizeof(WORD)==sizeof(int),这是错误的!我真傻我在padding/secutiry check空格上测试了你的评论,发现了它。一个有用的建议,再次谢谢。@PapaAtHome我很高兴我能帮上忙。如果您认为我的答案有帮助,请随时投票支持:-)。