我们有一些遗留代码在某个时间点将 long 数据类型重构为 int 数据类型。在此重构期间,许多 printf / sprintf 格式语句被保留为不正确的 %ld 而不是更改为 %d。例如:
int iExample = 32;
char buf[200];
sprintf(buf, "Example: %ld", iExample);
此代码在 GCC 和 VS2012 编译器上编译。我们使用 Coverity 进行静态代码分析,示例中的代码被标记为“Printf arg 类型不匹配”,严重程度为中等,CWE-686: Function Call With Incorrect Argument Type 我可以看到这绝对是一个问题格式字符串是带有无符号 int 类型或类似这些行的有符号 (%d) 的格式字符串。
我知道 sprintf 等的 '_s' 版本更安全,并且上面的代码也可以重构为使用 std::stringstream 等。但是它是遗留代码......
我同意上面的代码至少应该使用 %d 或者重构为使用 std::stringstream 之类的东西。
出于好奇,是否存在上述代码会产生错误结果的情况?由于这个遗留代码已经存在了很长一段时间,并且似乎运行良好。
更新
- 删除了 STL 一词的用法,只是将其更改为 std::stringstream。