gpt4 book ai didi

c - sprintf/snprintf 哪个更安全?

转载 作者:太空狗 更新时间:2023-10-29 16:20:16 43 4
gpt4 key购买 nike

我想知道这两个选项中哪一个更安全:

#define MAXLEN 255
char buff[MAXLEN + 1]
  1. sprintf(buff, "%.*s", MAXLEN, name)

  2. snprintf(buff, MAXLEN, "%s", name)

我的理解是两者是一样的。请提出建议。

最佳答案

您给出的两个表达式是等价的:sprintf 没有指定要写入的最大字节数的参数;它只需要一个目标缓冲区、一个格式字符串和一堆参数。因此,它可能会写入比您的缓冲区空间更多的字节,并在这样做时写入任意代码。 %.*s 不是令人满意的解决方案,因为:

  1. 当格式说明符引用长度时,它指的是 strlen 的等价物;这是字符串中字符数的度量,而不是它在内存中的长度(即不计算空终止符)。
  2. 格式字符串中的任何更改(例如添加换行符)都会更改 sprintf 版本在缓冲区溢出方面的行为。使用 snprintf,无论格式字符串或输入类型如何变化,都会设置一个固定的、明确的最大值。

关于c - sprintf/snprintf 哪个更安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7315936/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com