CodeQL 文档

字符串上的引用相等性测试

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

点击查看 CodeQL 代码库中的查询

使用 ==!= 比较两个 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
}

参考资料

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