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的值会那么奇怪了。

Microsoft Visual Studio C 运行时库在 XXX.exe 中检测到一个错误。

Microsoft Visual Studio C 运行时库在 XXXX.exe 中检测到一个错误。 按“中断”以调试程序,或按“继续”以终止程序。 当点击中断调试的时候,程序会执行到绿色...
  • zhu339111520
  • zhu339111520
  • 2015年02月25日 15:37
  • 1288

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

Visual Studio 代码生成 运行时库的选择   运行时库的选项有:多线程(/MT)、多线程调试(/MTD)、多线程DLL(/MD)、多线程调试(/MDd) 有时调用外部的一些库,这...
  • Super_cpp
  • Super_cpp
  • 2016年11月02日 18:24
  • 1062

VS中各种C运行时库的区别

各种C运行时库的区别   编译器链接选项:   Visual C++编译时到底哪个C运行时库联入程序取决于编译选项,选项告诉编译器应用程序想使用什么版本的C标准程序库。与标准程...
  • lc_910927
  • lc_910927
  • 2015年02月05日 14:11
  • 1581

[原创]使用Visual Studio .NET编写纯C程序的提示

使用Visual Studio .NET编写纯C程序的提示作者:lover_P    所谓的纯C程序,是指该程序(包括可执行程序或库)之源代码所用语法严格遵守C89标准,且所用之库函数,要么为C89标...
  • loverP
  • loverP
  • 2004年08月20日 21:50
  • 7290

都是visual studio 2010 BUG惹的祸

这两天项目在用C#调用C++编写的一些库时遇到一个很头痛的问题,用C++对DLL进行测试没有任何问题,可用C#进行调用时居然所有输出参数均未被改变,也就是输出没有任何输出,但返回值是正确的。同事调了两...
  • Nocky
  • Nocky
  • 2011年09月15日 22:46
  • 1427

Visual Studio 各版本区别及下载

Visual Studio 各版本区别: 从1998年的 6.0 到现在的 2010 Ultimate 如何注册和获得以及购买许可 VS101 2010-07-08 04:33:59 阅读1072 ...
  • wisage
  • wisage
  • 2011年05月31日 09:28
  • 4370

Microsoft Visual Studio C 运行时库在 XXX.exe 中检测到一个错误

以下内容转载http://blog.csdn.net/yuzhiyi926/article/details/7239675 现象: Microsoft Visual Studio C 运行时库在 ...
  • cwm_meng
  • cwm_meng
  • 2013年09月27日 11:43
  • 2441

Visual Studio .NET 2003开发环境

昨天到今天搞了一整天,把人都要差点搞崩了! ,以后再也不能乱关机了,因为这次的大意,几乎所有的Net安装,调试问题都被我碰到了,还好,我一个个把他记录下来了,同时,在CSDN找了一些相关的解决方法,不...
  • msdnlu
  • msdnlu
  • 2007年07月12日 09:17
  • 1169

VisualStudio2003 下载地址

VisualStudio2003  下载地址http://www.ivdown.com/ShowContent.aspx?id=1546&pid=4&cid=36 msdn2003帮助文件下载地址 ...
  • xqf222
  • xqf222
  • 2006年09月25日 21:21
  • 2056

Visual Studio .Net 2003 的安装

Q:安装Visual Studio .Net 2003,结果出现提示:“安装程序检测到另一个程序要求计算机重新启动.必须重新启动计算机后才能安装visual studio.net系统必备.系统重新启动...
  • Elysium
  • Elysium
  • 2006年09月01日 13:15
  • 9651
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Visual studio 2003中C运行时库(MSVCR71)中swprintf函数的BUG
举报原因:
原因补充:

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