关闭

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

标签: cstring测试.net语言微软
1935人阅读 评论(1) 收藏 举报
分类:
    最近,在将原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的值会那么奇怪了。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:97753次
    • 积分:1347
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:8篇
    • 译文:2篇
    • 评论:43条
    文章分类
    最新评论