CodeQL 文档

相同值的比较

ID: java/comparison-of-identical-expressions
Kind: problem
Security severity: 
Severity: error
Precision: very-high
Tags:
   - reliability
   - correctness
   - logic
Query suites:
   - java-security-and-quality.qls

单击以在 CodeQL 存储库中查看查询

如果比较两个相同表达式(即检查相等性或不相等性),这通常表示错误,因为比较的布尔值始终相同。通常,它表示在字段访问中使用了错误的限定符。

浮点变量与其自身的不相等 (!=) 和相等 (==) 测试例外:特殊浮点值 NaN(“非数字”)是唯一不被视为等于自身的值。因此,其中 xfloatdouble 变量的测试 x != x 等效于检查 x 是否为 NaN,对于 x == x 也是如此。

建议

将值与其自身进行比较永远不是好习惯。如果您需要恒定行为,请使用布尔文字 truefalse,而不是将其模糊地编码为 1 == 1 或类似内容。

如果浮点变量使用不等式测试(使用 !=)是故意的,则应将其替换为 Double.isNaN(...)Float.isNaN(...) 以便于阅读。同样,如果浮点变量使用相等性测试(使用 ==)是故意的,则应将其替换为 !Double.isNaN(...)!Float.isNaN(...)

示例

在下面的示例中,Customer 的原始版本将 idid 进行了比较,该比较始终返回 true。更正后的 Customer 版本在将 ido.id 进行比较时包含了缺少的限定符 o

class Customer {
	...
	public boolean equals(Object o) {
		if (o == null) return false;
		if (Customer.class != o.getClass()) return false;
		Customer other = (Customer)o;
		if (!name.equals(o.name)) return false;
		if (id != id) return false;  // Comparison of identical values
		return true;
	}
}

class Customer {
	...
	public boolean equals(Object o) {
		if (o == null) return false;
		if (Customer.class != o.getClass()) return false;
		Customer other = (Customer)o;
		if (!name.equals(o.name)) return false;
		if (id != o.id) return false;  // Comparison corrected
		return true;
	}
}

参考

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