不可转换类型之间的比较¶
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
在 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.");
参考文献¶
Mozilla 开发者网络:比较运算符。
Mozilla 开发者网络:相等比较和何时使用它们。
常见弱点枚举:CWE-570。
常见弱点枚举:CWE-571。