CodeQL 文档

移位超出范围

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

点击查看 CodeQL 仓库中的查询

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 的数将以不精确的方式表示。

参考

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