snprintf或vsnprintf更好,我怎样才能确保我安全地使用它们?

时间:2012-09-02 19:02:38

标签: c printf buffer-overflow

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

我可以轻松地在调用上进行查找和替换,以便它使用snprintf或vsnprintf,但我想确保没有其他任何事情需要完成才能使功能安全

在某些情况下,使用的字符串源自用户输入,在某些情况下,它们不会。

有人对如何做到这一点有任何建议吗?

1 个答案:

答案 0 :(得分:5)

  

我可以轻松地在调用中进行查找和替换,以便它使用snprintf或vsnprintf代替

不,这并不容易。只需查看snprintfvsnprintf的定义,您将看到它们采用名为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);

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