移位超出范围¶
ID: js/shift-out-of-range
Kind: problem
Security severity:
Severity: error
Precision: very-high
Tags:
- reliability
- correctness
- external/cwe/cwe-197
Query suites:
- javascript-security-and-quality.qls
JavaScript 中的移位运算仅对 32 位值进行操作,因此不可能移位超过 31 个位置。如果移位运算符的右操作数大于 31,则左操作数实际上只移位该值模 32。
建议¶
使用标准库函数(例如Math.pow
)来执行所需的移位。或者,如果您所在的平台支持,可以使用BigInt 类型。
示例¶
以下代码片段尝试将x
赋值为 240(1099511627776)。但是,实际上,左操作数1
仅移位了8
(即 40 模 32),因此x
最终被赋值为 28(256)。
var x = 1<<40;
更好的解决方案是使用Math.pow
,如下所示
var x = Math.pow(2, 40);
但是请注意,JavaScript 在内部将大数表示为浮点数,因此大小大于 253 的数将以不精确的方式表示。