CodeQL 文档

传递给 StringBuffer 或 StringBuilder 构造函数的字符

ID: java/string-buffer-char-init
Kind: problem
Security severity: 
Severity: error
Precision: very-high
Tags:
   - reliability
   - maintainability
Query suites:
   - java-security-and-quality.qls

点击查看 CodeQL 存储库中的查询

将字符传递给 StringBufferStringBuilder 的构造函数可能是想将该字符插入到新创建的缓冲区中。然而,实际上字符值会被转换为整数,并被解释为缓冲区的初始容量,这可能会产生意想不到的结果。

示例

以下示例展示了一个表示二维笛卡尔坐标系中点的类。toString 方法使用 StringBuffer 构造一个可读的表示形式 (x, y),其中 xy 是点的坐标。

但是,左括号作为字符字面量传递给了 StringBuffer 构造函数。该字符没有被用来初始化缓冲区的内容,而是被转换为整数值 40,并被解释为缓冲区的初始容量。因此,toString 返回的字符串表示形式将缺少左括号。(请注意,另一方面,将字符传递给 append 是没有问题的。)

class Point {
	private double x, y;
	
	public Point(double x, double y) {
		this.x = x;
		this.y = y;
	}
	
	@Override
	public String toString() {
		StringBuffer res = new StringBuffer('(');
		res.append(x);
		res.append(", ");
		res.append(y);
		res.append(')');
		return res.toString();
	}
}

建议

如果用于初始化缓冲区的字符是字符字面量,只需将其替换为相应的字符串字面量。因此,在我们的示例中,将 new StringBuffer('(') 替换为 new StringBuffer("(")。如果字符不是字面量值,请使用方法 String.valueOf 将其转换为字符串。

参考文献

  • ©GitHub 公司
  • 条款
  • 隐私