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

原创 2007年09月18日 10:24:00
    最近,在将原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的值会那么奇怪了。

相关文章推荐

visual studio运行时库MT、MTd、MD、MDd的研究

在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装响应的运行时库导致的,那么这个与编译选项MT、MTd、MD、MDd有什么关系呢?这是...
  • ybxuwei
  • ybxuwei
  • 2013年06月14日 17:53
  • 3152

Visual Studio 运行时库的选择的区别

Visual Studio 代码生成 运行时库的选择   运行时库的选项有:多线程(/MT)、多线程调试(/MTD)、多线程DLL(/MD)、多线程调试(/MDd) 有时调用外部的一些库,这...

Visual C++中的C运行时库浅析

1.概论  运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的。C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属...
  • sshhbb
  • sshhbb
  • 2011年01月11日 15:41
  • 1030

Visual C++中的C运行时库浅析

转自:http://www.bccn.net/Article/kfyy/vc/jszl/200608/4278.html 1.概论   运行时库是程序在运行时所需要的库文件,通常运...

Visual Studio 2008运行时提示找不到msvcr90d.dll的解决办法

转自:http://hi.baidu.com/zgjxwl/blog/item/79b55609b892af87d0581b5b.html 具体解决办法 一、将debug模式改为Release,然...

Visual Studio 2008运行时提示找不到msvcr90d.dll的解决办法 (1)

本文转载自:http://hi.baidu.com/zgjxwl/blog/item/79b55609b892af87d0581b5b.html         说说微软的bug吧,昨天装Visua...

main函数执行之前都干啥了----C/C++运行时库剖析

本文介绍运行时库实现的功能,你会看到在main函数执行之前都做了什么操作!...

关于Visual Studio2003中提示窗口标题:Web访问失败,并无法打开项目时的资料

文/rdxx  出处/ctocio.com.cn,http://www.pin5i.com/showtopic-16861.html   初认.NET开发不久,发现每次从VSS中取出Web项目后...

(Visual Studio)Solve problems like "MSVCR110.dll is missing from your compute"

When someone others run an executive which I generated with VS 2012 in their PCs,  they occurred the...

C运行时库详解

  • 2011年09月29日 16:29
  • 41KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Visual studio 2003中C运行时库(MSVCR71)中swprintf函数的BUG
举报原因:
原因补充:

(最多只允许输入30个字)