CodeQL 文档

装箱类型的引用相等性测试

ID: java/reference-equality-of-boxed-types
Kind: problem
Security severity: 
Severity: error
Precision: very-high
Tags:
   - reliability
   - correctness
   - external/cwe/cwe-595
Query suites:
   - java-security-and-quality.qls

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

使用 ==!= 比较两个装箱基本值会比较对象标识,这可能不是预期目的。

建议

通常,你应该使用非基本对象(例如装箱基本值)的 equals 方法来比较它们。

示例

使用以下定义,方法调用 refEq(new Integer(2), new Integer(2)) 返回 false,因为对象不相同。

boolean refEq(Integer i, Integer j) {
	return i == j;
}

使用以下定义,方法调用 realEq(new Integer(2), new Integer(2)) 返回 true,因为对象包含相等的值。

boolean realEq(Integer i, Integer j) {
	return i.equals(j);
}

参考

  • J. Bloch 和 N. Gafter,Java Puzzlers:陷阱、缺陷和边界情况,谜题 32。Addison-Wesley,2005 年。

  • Java API 规范:Object.equals()Integer.equals()

  • 通用弱点枚举:CWE-595

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