CodeQL 文档

不可转换类型之间的比较

ID: js/comparison-between-incompatible-types
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - reliability
   - correctness
   - external/cwe/cwe-570
   - external/cwe/cwe-571
Query suites:
   - javascript-security-and-quality.qls

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

在 JavaScript 中,相等运算符(==!====!==)和关系运算符(<<=>>=)可以应用于任意类型的值。但是,如果操作数无法转换为公共类型,则比较结果将始终是微不足道的真(对于相等)或假(对于不相等)。这种比较通常是由于拼写错误或对语言语义的误解。

建议

仔细检查比较,以查看它是否是由拼写错误引起的。如果其中一个操作数是常量,请将其替换为正确类型的常量。否则,引入适当的函数调用以将操作数转换为公共类型。

示例

以下代码试图检查全局变量 window 是否已定义

if (typeof window !== undefined)
	console.log("Running in a browser.");

但是,此测试无效:typeof 始终返回字符串,而不是 undefined,因此 if 条件将始终评估为 true。相反,typeof 的结果应与字符串文字 "undefined" 进行比较

if (typeof window !== "undefined")
	console.log("Running in a browser.");

再举一个例子,考虑以下代码片段,它旨在检查字符串 "hello" 是否出现在变量 text 中持有的字符串中。

if (text.indexOf("hello" >= 0))
	console.log("Found it.");

但是,请注意,该测试被误写了:对 index 的调用的结束括号应该出现在运算符 >= 之前,而不是之后。就其本身而言,此代码执行常量字符串 "hello" 和数字零之间的大于或等于比较,该比较评估为 false。此值然后传递给 indexOf,该值将其转换为字符串 "false" 并返回此字符串在 text 中出现的第一个索引(或者如果它根本没有出现,则返回 -1)。

要解决此问题,应重新括号化测试,如下所示

if (text.indexOf("hello") >= 0)
	console.log("Found it.");

参考文献

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