字符串上的引用相等性测试¶
ID: java/reference-equality-on-strings
Kind: problem
Security severity:
Severity: warning
Precision: medium
Tags:
- reliability
- external/cwe/cwe-597
Query suites:
- java-security-and-quality.qls
使用 ==
或 !=
比较两个 String
对象会比较对象标识,这可能不是预期行为。相同的字符序列可以由两个不同的 String
对象表示。
建议¶
若要查看两个 String
对象是否表示相同的字符序列,通常应使用它们的 equals
方法比较这些对象。
示例¶
使用以下定义,headerStyle
使用 ==
与空字符串进行比较。即使 headerStyle
是空字符串,此比较也可能产生 false
,因为它比较的是两个字符串对象的标识,而不是它们的内容。例如,如果 headerStyle
由 XML 解析器或 JSON 解析器初始化,那么它可能使用类似于 String.valueOf(buf,start,len)
的代码创建。此类代码每次调用都会产生一个新的字符串对象。
void printHeader(String headerStyle) {
if (headerStyle == null || headerStyle == "") {
// No header
return;
}
// ... print the header
}
使用以下定义,headerStyle
使用 equals
方法进行测试。此版本将可靠地检测何时 headerStyle
是空字符串。
void printHeader(String headerStyle) {
if (headerStyle == null || headerStyle.equals("")) {
// No header
return;
}
// ... print the header
}
参考资料¶
Java API 规范:String.equals(),String.intern().
Java 语言规范:15.21.3 引用相等运算符 == 和 !=,3.10.5 字符串字面量,15.28 常量表达式.
通用弱点枚举:CWE-597.