CodeQL 文档

传递给 StringBuilder 构造函数的字符

ID: cs/stringbuilder-initialized-with-character
Kind: problem
Security severity: 
Severity: error
Precision: high
Tags:
   - maintainability
Query suites:
   - csharp-security-and-quality.qls

单击以在 CodeQL 代码库中查看查询

将字符传递给 StringBuilder 的构造函数可能是想将该字符插入到字符串中。然而,实际上,字符值会被转换为整数并解释为内部缓冲区的初始容量,因此字符值不会被插入到字符串中。

示例

以下示例显示了一个 ToString() 方法,该方法用于格式化数组的内容。但是,表达式 new StringBuilder('(') 不会将字符 '(' 添加到字符串 str 中,而只是初始化缓冲区的大小,因此生成的字符串不包含前导 '(' 字符。

public override string ToString()
{
    var str = new StringBuilder('('); // BAD: Character value.
    for (int i = 0; i < values.Length; ++i)
    {
        if (i > 0) str.Append(',');
        str.Append(values[i]);
    }
    str.Append(')');
    return str.ToString();
}

请注意,另一方面,将字符传递给 Append() 则没有问题。

可以通过使用字符串初始化 StringBuilder 来解决此问题,这会将 "(" 放在字符串的开头。

public override string ToString()
{
    var str = new StringBuilder("("); // GOOD: String value.
    for (int i = 0; i < values.Length; ++i)
    {
        if (i > 0) str.Append(',');
        str.Append(values[i]);
    }
    str.Append(')');
    return str.ToString();
}

建议

如果用于初始化缓冲区的字符是字符字面量,只需将其替换为相应的字符串字面量即可。因此,在我们的示例中,将 new StringBuilder('(') 替换为 new StringBuilder("(")。如果该字符不是字面量值,请使用 ToString() 将其转换为字符串,或者使用对 Append() 的额外调用将该值插入到字符串中。

参考

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