gpt4 book ai didi

c - 不安全的 C 函数和替换

转载 作者:太空狗 更新时间:2023-10-29 15:12:56 28 4
gpt4 key购买 nike

如果我错了,请纠正我,我在网站上进行了研究,但找不到针对此问题的任何综合帖子。 C 中有许多不安全的函数会导致缓冲区溢出,它们有安全的函数来替代它们。我有几个:

  • gets() === 替换为 === fgets()
  • sprintf() === 替换为 === ?
  • strcat() === 替换为 === ?
  • strcpy() === 替换为 === strncpy()
  • vsprintf() === 替换为 === vsnprintf()

此外,我坚持使用下面的不安全字节复制和不安全字节输入代码。我该如何解决这些问题?为什么这段代码有漏洞?

int copy_buf (char *to, int pos, char *from, int len)
{
int i;
for (i=0;i<len;<i++){
to[pos] = from [i];
pos++;
}
return pos
}

对于字节输入,fread()函数是不是不安全?为什么这里会发生缓冲区溢出呢?

short read_chunk(FILE fil, char *to)
{
short len;
fread(&len, 2, 1, fil);
fread(to, 1, len, fil);
return len;
}

最佳答案

strncpy 不是 strcpy 的安全替代品。事实上,尽管不幸的是在命名上相似,但这些函数是不相关的。 strcpy 的安全替换是一些 *nix 实现作为扩展提供的非标准函数 strlcpy。使用 strncpy 进行“安全”字符串复制是无能代码的直接标志。

另一组不安全函数(虽然由于不同的原因不安全)是来自 ato.. 组的函数:atoiatofatol 等等。这些函数会在溢出时触发未定义的行为。它们的安全替换是来自 strto... 组的函数:strtolstrtod 等。

从某种意义上说,copy_buf 函数没有任何“不安全”之处,因为它为调用代码提供了执行对 copy_buf 的安全调用所需的所有方法。在这种情况下传递正确值的责任落在调用者身上。

您的 read_chunk 函数要危险得多,因为调用代码无法知道缓冲区应该有多大。这个函数没有完美的解决方案可以很好地处理从外部传递的缓冲区。至少让调用代码也传递缓冲区的大小是有意义的。这将允许 read_chunk 确保缓冲区没有溢出。此外,read_chunk 应该通知调用代码有关不完整的读取。您应该为调用者提供完成读取的方法。

关于c - 不安全的 C 函数和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26558197/

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