CodeQL 文档

对 Equals(object) 的递归调用

ID: cs/recursive-equals-call
Kind: problem
Security severity: 
Severity: error
Precision: high
Tags:
   - reliability
   - maintainability
Query suites:
   - csharp-security-and-quality.qls

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

Equals(object) 的递归调用通常是在尝试转发到具有更具体的参数类型的另一个 Equals 方法时意外进行的。这往往会导致堆栈溢出异常。

建议

解决方案是在进行调用时检查参数是否为适当的类型,然后进行强制转换。

示例

在此示例中,当程序员明确希望将对象传递给 Equals(C) 方法但忘记了进行强制转换以实现此目的时,会反复调用 Equals(object) 方法。

class RecursiveEquals
{
    class C
    {
        private int i = 0;
        public override bool Equals(object rhs)
        {
            if (rhs.GetType() != this.GetType()) return false;
            return Equals(rhs);
        }

        public bool Equals(C rhs)
        {
            return (rhs != null && this.i == rhs.i);
        }
    }
}

可以通过在进行第二次调用之前执行强制转换来轻松更正此错误。

class RecursiveEqualsFix
{
    class C
    {
        private int i = 0;
        public override bool Equals(object rhs)
        {
            if (rhs.GetType() != this.GetType()) return false;
            return Equals((C)rhs);
        }

        public bool Equals(C rhs)
        {
            return (rhs != null && this.i == rhs.i);
        }
    }
}
  • ©GitHub 公司
  • 条款
  • 隐私