CodeQL 文档

比较相同的值

ID: cs/comparison-of-identical-expressions
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - reliability
Query suites:
   - csharp-security-and-quality.qls

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

如果比较两个相同的表达式(即,检查它们是否相等或不相等),这通常表示存在错误,因为比较的布尔值始终相同。通常,这表示在字段访问中使用了错误的限定符。

浮点变量与其自身的不等性(!=)和相等性(==)测试适用以下例外情况:特殊的浮点值 NaN(“非数字”)是唯一不被视为与其自身相等的值。因此,测试 x != x(其中 xfloatdouble 变量)等效于检查 x 是否为 NaNx == x 也是如此。

建议

将值与其自身进行比较绝非好习惯。如果需要常量行为,请使用布尔值字面量 truefalse,而不是将其模糊地编码为 1 == 1 或类似形式。

如果故意对浮点变量与其自身进行不等性测试(使用 !=),则为了提高可读性,应将其替换为 double.IsNaN(...)float.IsNaN(...)。同样,如果故意对浮点变量与其自身进行相等性测试(使用 ==),则应将其替换为 !double.IsNaN(...)!float.IsNaN(...)

示例

在此示例中,开发人员显然打算将 age 与 personObj.age 进行比较,但实际上是将 age 与自身进行了比较。

class Person
{
    private string name;
    private int age;
    public Person(string name, int age)
    {
        this.name = name;
        this.age = age;
    }
    public override bool Equals(object obj)
    {
        Person personObj = obj as Person;
        if (personObj == null)
        {
            return false;
        }
        return name == personObj.name && age == age; // BAD
    }
}

参考

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