C++ “snprintf_s”带来的虚假安全感`

C++ “snprintf_s”带来的虚假安全感`,c++,visual-c++,visual-studio-2005,visual-c++-2005,C++,Visual C++,Visual Studio 2005,Visual C++ 2005,MSVC的“secure”sprintf函数有一个“知道”目标缓冲区大小的模板版本。然而,这段代码在字节结束后愉快地在堆栈上绘制567890 char bytes[5]; _snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" ); 知道我做错了什么吗?或者这是一个已知的错误 (我在VS2005工作-在2008年或2010年没有测试过)看起来确实如此(我很难找到那个链接;) 我在Visual C++ 2005中能够重现这个问题。在Visual C++

MSVC的“secure”
sprintf
函数有一个“知道”目标缓冲区大小的模板版本。然而,这段代码在
字节结束后愉快地在堆栈上绘制567890

char bytes[5];
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );
知道我做错了什么吗?或者这是一个已知的错误

(我在VS2005工作-在2008年或2010年没有测试过)

看起来确实如此(我很难找到那个链接;)

<>我在Visual C++ 2005中能够重现这个问题。在Visual C++ 2008和2010中,字符串被正确截断(<代码>字节< /COD>包含代码> 1234 \ 0 < /代码>),“代码> -1 < /COD>按预期返回。

< P>示例是错误的。< /P> 代码应为:

char bytes[5];
_snprintf_s( bytes, 5, _TRUNCATE, "%s", "1234567890" );

对于错误的代码,编译器没有给出任何警告可能是一个bug,但这可能是对snprintf的弱检查。

该示例确实正确。截至版本--

--其中包括SP1、vista修补程序和一些库修补程序-- 上述功能

template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
      argument] ... 
);
模板
内部打印(
字符(&缓冲区)[大小],
大小不可计数,
常量字符*格式[,
参数]。。。
);
仍然是马车。然而,真正吸引人的是,只有4个变量函数中的这个函数

  • 确定:
    int\u snprintf\u s(字符*缓冲区,大小大小缓冲区,大小计数,:
  • 错误:
    template int\u snprintf\u s(字符和缓冲区)[size],size\u t count,:
  • 确定:
    int\u snwprintf\u s
    (宽字符版本)
  • 确定:
    template int\u snwprintf\u s
    (是的,宽字符版本可以)

就是说,如果一个人使用的是非模板版本,那就没问题,如果一个人使用的是宽字符版本,那也没问题。太棒了。

Ouch!这是一个令人尴尬的问题。谢谢!似乎错误报告真的从MS Connect网站上消失了…-1:这个问题既古老又有答案,是关于过载的使用
\u snprintf\u s
的数组进行写入。它不必使用大小,因为它可以从模板参数中获取大小。除了在VC 2005中,这被破坏。
template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
      argument] ... 
);