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