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

标签 c printf buffer-overflow

我决定在一些旧代码上运行一个静态分析工具,我发现了很多我正在使用 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/

相关文章:

c++ - 带有宽度修饰符的 printf 无法打印值

linux - perl-mechanize 遇到限制 - 开始进行多次调试尝试

c - 如何使用缓冲区溢出执行 "printf string attack"?

c - 缓冲区溢出内存映射解释

比较 C 中的字符

C初学者题: Pointer to a pointer/Can't access values from outside a function

python - 从/proc/stat 计算 user、nice、sys、idle、iowait、irq 和 sirq

c++ - 使用 LD_PRELOAD 和 dlsym() 覆盖 'free' 或 'delete'

c - 为什么 ANSI 在第一次调用函数时打印代码并在第二次调用时打印颜色?

c++ - 分配给 int 类型缓冲区的大内存大小