【问题标题】:How does sprintf_s avoid buffer overflow issuesprintf_s 如何避免缓冲区溢出问题
【发布时间】:2021-09-19 14:23:01
【问题描述】:

Visual Studio 提示我将 sprintf 替换为 sprintf_s,而不是 snprintf

sprintf_s不需要长度参数,如何避免缓冲区溢出问题?

【问题讨论】:

  • 有模板版本可以从buffer 参数中推断出大小。如果失败,您需要提供尺寸。 docs.microsoft.com/en-us/cpp/c-runtime-library/reference/… 这有一个例子来展示它什么时候会推断出大小,什么时候不会。 docs.microsoft.com/en-us/cpp/c-runtime-library/…
  • 如果你使用的是 C11 中引入的sprintf_s(),第二个参数是字符串缓冲区的大小。 Microsoft 还在 C++ 中指定了一个非标准模板化版本,它接受 char 数组作为第一个参数,其中大小是模板参数。后者不能传递char *(因为无法推断大小)。

标签: c++ windows visual-studio


【解决方案1】:

有 2 个版本。一个模板版本尝试推断缓冲区的大小,另一个模板版本用于传递大小。

int sprintf_s<_Size>(char (&_Dest)[_Size], const char *_Format, ...)
int sprintf_s(char * _DestBuf, size_t _SizeInBytes, const char *_Format, ...)

如果无法推断出第一个,则必须自己传递大小

所以这个:

char buf[100];

sprintf_s(buf, "%d", 1);

将实例化一个函数模板

sprintf_s<100>();

这会产生编译错误:

char *buf = new char[100];

sprintf_s(buf, "%", 1);

而且你必须使用其他版本才能编译:

sprintf_s(buf, 100, "%d", 1);

【讨论】:

    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2019-06-20
    • 1970-01-01
    相关资源
    最近更新 更多