最近,在将原VS2003的工程迁移到VS2005下时,发现在VS2003的C运行时库(MSVCR71) 中居然存在一个关于swprinf函数的BUG。关于这个BUG,首先可以做如下试验:
(1)在VS2003中建立一控制台程序;
(2)如下实现main函数:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t buf1[100] = { 0 };
wchar_t buf2[100] = { 0 };
swprintf( buf1,100,L"Result1=%d ",100 );
swprintf( buf2,L"Result2=%d ",100 );
wprintf( buf1 );
wprintf( buf2 );
return 0;
}
(3)项目设置修改如下:
常规-》字符集:Unicode字符集
C/C++-》语言-》将wchar_t视为内置类型:否
(4)编译运行,结果如下(result1的结果不确定):
Result1 = 1245032
Result2 = 100
很显然Result1的结果是错误的,为什么会出现这样的情况呢?经过测试,发现如果”将wchar_t类型视为内置类型“选项改为”是“的话,Result1的结果也是正确的。同时,经过测试发现在VS2005下所有的情况下都是正确的,于是问题肯定出在VS2003所带的C运行时库MSVCR71中了。
经过分析VS2003所带的C运行时库源码(位于:X:/Microsoft Visual Studio .NET 2003/Vc7/crt/src下),找到swprintn.cpp文件,一看才发现微软实现swprintf函数的开发人员犯了一个低级错误:
相信大家已经看到了,上面一个函数直接调用下面一个函数,但是却丢掉了函数的第三个参数以后的所有可能的可选参数,结果会对才怪?所以难怪上述的测试程序中Result1的值会那么奇怪了。
(1)在VS2003中建立一控制台程序;
(2)如下实现main函数:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t buf1[100] = { 0 };
wchar_t buf2[100] = { 0 };
swprintf( buf1,100,L"Result1=%d ",100 );
swprintf( buf2,L"Result2=%d ",100 );
wprintf( buf1 );
wprintf( buf2 );
return 0;
}
常规-》字符集:Unicode字符集
C/C++-》语言-》将wchar_t视为内置类型:否
(4)编译运行,结果如下(result1的结果不确定):
Result1 = 1245032
Result2 = 100
很显然Result1的结果是错误的,为什么会出现这样的情况呢?经过测试,发现如果”将wchar_t类型视为内置类型“选项改为”是“的话,Result1的结果也是正确的。同时,经过测试发现在VS2005下所有的情况下都是正确的,于是问题肯定出在VS2003所带的C运行时库MSVCR71中了。
经过分析VS2003所带的C运行时库源码(位于:X:/Microsoft Visual Studio .NET 2003/Vc7/crt/src下),找到swprintn.cpp文件,一看才发现微软实现swprintf函数的开发人员犯了一个低级错误:
int __cdecl swprintf (
unsigned short *string,
size_t count,
const unsigned short *format,
...
)
{
return swprintf(reinterpret_cast<wchar_t *>(string), count, reinterpret_cast<const wchar_t *>(format));
}
int __cdecl swprintf (
wchar_t *string,
size_t count,
const wchar_t *format,
...
)
{
// 具体实现略去
}
unsigned short *string,
size_t count,
const unsigned short *format,
...
)
{
return swprintf(reinterpret_cast<wchar_t *>(string), count, reinterpret_cast<const wchar_t *>(format));
}
int __cdecl swprintf (
wchar_t *string,
size_t count,
const wchar_t *format,
...
)
{
// 具体实现略去
}
相信大家已经看到了,上面一个函数直接调用下面一个函数,但是却丢掉了函数的第三个参数以后的所有可能的可选参数,结果会对才怪?所以难怪上述的测试程序中Result1的值会那么奇怪了。
本文分析了VS2003环境下C运行时库MSVCR71中的swprintf函数存在的一个BUG,通过示例程序展示了在特定配置下该函数返回错误结果的现象,并深入探讨了其原因。

wchar_t buf1[
7053

被折叠的 条评论
为什么被折叠?



