装箱类型的引用相等性测试¶
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
使用 ==
或 !=
比较两个装箱基本值会比较对象标识,这可能不是预期目的。
建议¶
通常,你应该使用非基本对象(例如装箱基本值)的 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。