数组长度比较时出现越界错误¶
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.