数组长度比较时出现越界错误¶
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
从大于数组长度的索引读取数组元素始终返回 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;
}
参考¶
Mozilla 开发者网络:Array.length
Mozilla 开发者网络:Array.forEach
Mozilla 开发者网络:for…of
通用弱点枚举:CWE-193.