我决定在一些旧代码上运行一个静态分析工具,我找到了一些我正在使用sprintf的地方。该工具建议用vsnprintf或snprintf替换调用,因为sprintf不会对缓冲区溢出进行任何类型的边界检查。
我可以轻松地在调用上进行查找和替换,以便它使用snprintf或vsnprintf,但我想确保没有其他任何事情需要完成才能使功能安全
在某些情况下,使用的字符串源自用户输入,在某些情况下,它们不会。
有人对如何做到这一点有任何建议吗?
答案 0 :(得分:5)
我可以轻松地在调用中进行查找和替换,以便它使用snprintf或vsnprintf代替
不,这并不容易。只需查看snprintf
或vsnprintf
的定义,您将看到它们采用名为size
的额外参数来指定输出缓冲区的长度。这就是函数名中n
的含义。为了使您的代码安全,您必须查看您正在执行sprintf的每个位置,找出可以安全写入输出缓冲区的最大字节数,并将该数字作为size
参数传递给snprintf
或vsnprintf
。
不安全的代码:
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);
如果您的所有代码都符合上述示例,那么您可以进行搜索和替换。但对于更复杂的案例,您可能需要考虑它。