“snprintf_s”的错误安全感

发布于 2024-08-30 09:09:20 字数 282 浏览 4 评论 0原文

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

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

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

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

MSVC's "secure" sprintf funcions have a template version that 'knows' the size of the target buffer. However, this code happily paints 567890 over the stack after the end of bytes...

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

Any idea what I do wrong, or is this a known bug?

(I'm working in VS2005 - didn't test in 2008 or 2010)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

黯然 2024-09-06 09:09:20

它似乎确实是一个错误在 Visual C++ 2005 中(我无法访问该链接;Google 也对其进行了缓存)。

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

It does appear to be a bug in Visual C++ 2005 (I'm having trouble getting to that link; Google also has it cached).

I was able to reproduce the problem in Visual C++ 2005. In Visual C++ 2008 and 2010, the string is correctly truncated (bytes contains 1234\0) and -1 is returned as expected.

情魔剑神 2024-09-06 09:09:20

这个例子确实是正确的。截至版本 --

Microsoft Visual Studio 2005
Version 8.0.50727.867 (vsvista.050727-8600)
...
Visual C++ 77626-009-0000007-41722

-- 包括 SP1、vista 修补程序和一些库修补程序 --
上面提到的函数

template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
      argument] ... 
);

仍然有问题。然而,真正令人着迷的是,只有 4 个变体中的这个函数

  • 可以正常运行:int _snprintf_s(char *buffer, size_t sizeOfBuffer, size_t count, :::
  • templateint _snprintf_s(char (&buffer)[size], size_t count, :::
  • OK: int _snwprintf_s (宽字符版本)
  • OK: templateint _snwprintf_s (是的,宽字符版本可以)

是有问题的,也就是说,如果使用非模板版本,则可以,如果使用任一宽字符版本也不错。

The example is indeed correct. As of version --

Microsoft Visual Studio 2005
Version 8.0.50727.867 (vsvista.050727-8600)
...
Visual C++ 77626-009-0000007-41722

-- which includes SP1, the vista hotfix and a few of the library hotfixes --
the above mentioned function

template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
      argument] ... 
);

still is buggy. However, what is really fascinating is that only this function of the 4 variant functions

  • OK: int _snprintf_s(char *buffer, size_t sizeOfBuffer, size_t count, :::
  • Buggy: template <size_t size> int _snprintf_s(char (&buffer)[size], size_t count, :::
  • OK: int _snwprintf_s (wide character version)
  • OK: template <size_t size> int _snwprintf_s (yes, the wide character version is OK)

is buggy, that is if one's using the non-template version it's OK, and if one's using either of the wide character versions it's OK too. Amazing.

林空鹿饮溪 2024-09-06 09:09:20

例子错了。

代码应该是:

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

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

Example was wrong.

The code should be:

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

For the wrong code, it may a bug that the compiler did not give any warning but it would be the weak checking for snprintf.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文