使用`snprintf_s`虚假的安全感

xto*_*ofl 22 c++ visual-studio-2005 visual-c++ visual-c++-2005

MSVC的"安全" sprintf功能具有"知道"目标缓冲区大小的模板版本.但是,这段代码在结束后很快就在堆栈中绘制了567890 bytes...

char bytes[5];
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么,或者这是一个已知的错误?

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

Jam*_*lis 21

它似乎确实是Visual C++ 2005中的一个错误(我无法访问该链接; Google也将其缓存).

我能够在Visual C++ 2005中重现该问题.在Visual C++ 2008和2010中,字符串被正确截断(bytes包含1234\0)并按-1预期返回.

  • 谢谢!似乎错误报告确实从MS Connect网站上消失了...... (3认同)