C++ “snprintf_s”带来的虚假安全感`
MSVC的“secure”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++
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] ...
);