缺少对“scanf”类函数的返回值检查¶
ID: cpp/missing-check-scanf
Kind: path-problem
Security severity: 7.5
Severity: warning
Precision: medium
Tags:
- security
- correctness
- external/cwe/cwe-252
- external/cwe/cwe-253
Query suites:
- cpp-security-extended.qls
- cpp-security-and-quality.qls
此查询查找对 scanf
类函数的调用,这些调用缺少或不正确地检查返回值。
具体来说,该查询标记了可能被 scanf
修改的变量的使用,这些变量在没有进行正确的返回值检查的情况下就被使用。正确的检查应确保相应的 scanf
已经返回(至少)某个最小常数。
scanf
家族中的函数在发生 IO 错误时返回 EOF(负值),或者返回从输入中成功读取的项目数量。因此,简单地检查返回值是否为真(非零)是不够的。
警告:此查询的精度中等,因为在当前实现中,它对未受保护的输出变量的使用采取严格的态度,即使这些变量已经初始化,也会将其标记为有问题。
建议¶
确保在 if
语句(或类似语句)的分支中使用所有后续的 scanf
输出参数,在该分支中,已知相应的 scanf
调用实际上已从其输入中读取所有可能的项目。可以通过将返回值与数值常量进行比较来实现这一点。
示例¶
此示例展示了保护 scanf
输出的不同方法
{
int i, j, r;
r = scanf("%d %d", &i, &j);
use(i); // BAD: i is not guarded
if (r >= 1) {
use(i); // GOOD: i is guarded correctly
use(j); // BAD: j is guarded incorrectly
}
if (r != 2)
return;
use(j); // GOOD: j is guarded correctly
}
参考资料¶
SEI CERT C++ 编码标准: ERR62-CPP. 检测将字符串转换为数字时的错误.
SEI CERT C 编码标准: ERR33-C. 检测和处理标准库错误.
cppreference.com: scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s.
常见弱点枚举: CWE-252.
常见弱点枚举: CWE-253.