CodeQL 文档

缺少对“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

点击查看 CodeQL 仓库中的查询

此查询查找对 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
}

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私