gpt4 book ai didi

c - snprintf 或 vsnprintf 哪个更好,我如何确保安全地使用它们?

转载 作者:行者123 更新时间:2023-12-03 16:18:03 26 4
gpt4 key购买 nike

我决定在一些旧代码上运行一个静态分析工具,我发现了很多我正在使用 sprintf 的地方。该工具建议使用 vsnprintf 或 snprintf 替换调用,因为 sprintf 不会对缓冲区溢出进行任何类型的边界检查。

我可以轻松地对调用进行查找和替换,以便它使用 snprintf 或 vsnprintf 代替,但我想确保无需执行任何其他操作即可确保功能安全

在某些情况下,所使用的字符串源自用户输入,而在某些情况下则不是。

有没有人对如何正确地做有任何建议?

最佳答案

I can easily just do a find and replace on the calls so that it uses snprintf or vsnprintf instead



不,没那么容易。看看 snprintf的定义就知道了或 vsnprintf你会看到他们接受了一个名为 size 的额外参数。指定输出缓冲区的长度。这就是 n在函数名中的意思。为了使您的代码安全,您必须查看执行 sprintf 的每个地方,找出可以安全写入输出缓冲区的最大字节数,并将该数字作为 size 传递。论据 snprintfvsnprintf .

不安全代码:
char buffer[10];
sprintf(buffer, "%d %d", x, y); // UNSAFE if x and y can be large

等效安全码:
char buffer[10];
snprintf(buffer, sizeof(buffer), "%d %d", x, y);

也许如果您的所有代码都符合上述示例,那么您可以进行搜索和替换。但是对于更复杂的情况,您可能需要考虑一下。

关于c - snprintf 或 vsnprintf 哪个更好,我如何确保安全地使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12238880/

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