Visual studio 2003中C运行时库(MSVCR71)中swprintf函数的BUG

本文分析了VS2003环境下C运行时库MSVCR71中的swprintf函数存在的一个BUG,通过示例程序展示了在特定配置下该函数返回错误结果的现象,并深入探讨了其原因。
    最近,在将原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函数的开发人员犯了一个低级错误:
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,
        ...
        )

{
   
// 具体实现略去
}
 
       相信大家已经看到了,上面一个函数直接调用下面一个函数,但是却丢掉了函数的第三个参数以后的所有可能的可选参数,结果会对才怪?所以难怪上述的测试程序中Result1的值会那么奇怪了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值