CodeQL 文档

数组长度比较时出现越界错误

ID: js/index-out-of-bounds
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - reliability
   - correctness
   - logic
   - external/cwe/cwe-193
Query suites:
   - javascript-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

从大于数组长度的索引读取数组元素始终返回 undefined。如果使用小于或等于运算符 <= 而不是小于运算符 < 将索引与数组长度进行比较,则索引可能超出边界,这可能并非有意为之,并且可能会对性能产生负面影响。

建议

在将潜在索引与数组长度进行比较时,使用小于 (<) 而不是小于或等于 (<=)。对于遍历数组中每个元素的循环,使用 for...of 循环或 forEach 方法,而不是显式迭代所有索引。

示例

以下示例显示了一个函数,该函数试图通过迭代数组 a 的元素并将其与 elt 进行比较来检查数组 a 是否包含元素 elt。但是,循环的终止条件错误地指定为 i <= a.length,而不是 i < a.length,因此 elt 还将与从索引 a.length 读取的值 undefined 进行比较,这意味着该函数认为每个数组都包含 undefined

function contains(a, elt) {
  for (let i = 0; i <= a.length; ++i)
    if (a[i] === elt)
      return true;
  return false;
}

可以使用小于而不是小于或等于来修复此问题

function contains(a, elt) {
  for (let i = 0; i < a.length; ++i)
    if (a[i] === elt)
      return true;
  return false;
}

参考

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