C# Coverity 在 RemoveAll 调用中给出“空检查前的取消引用 (REVERSE_INULL)”以从列表中删除空条目

问题描述

 public void UpdateCredentialSelect(ClientCredentials credential,bool selected)
{
    onsSelectedCredentials.RemoveAll(x => x.Equals(null));
    if (selected && !onsSelectedCredentials.Exists(x => x.name.Equals(credential.name)))
    {
        onsSelectedCredentials.Add(credential);
    }
    else
    {
        onsSelectedCredentials.Remove(credential);
    }

    onsSecurityScreen.UpdateDynamicItems();
    onsSecurityScreen.UpdateSelectAllCheckmark();
}

运行 Coverity 报告,发现“onsSelectedCredentials.RemoveAll(x => x.Equals(null));”有问题此处的行,说明“check_after_deref: Null-checking x 表明它可能为 null,但它已经在导致检查的所有路径上被取消引用。”该行代码的目的是读取列表中的当前值并去除任何已变为空的值,据我所知,没有发生空检查。这是 Coverity 的误报还是我应该做些什么来解决这个问题?

解决方法

如果 x.Equals(null)NullReferenceException,表达式 x 将抛出 null。它永远不会评估为 true(除非 Equals 已被覆盖以做一些奇怪的事情)。

Coverity 正确地告诉您这一点,尽管以某种间接的方式。具体来说,它理解 Equals 是为了测试相等性,并且您将 xnull 进行比较,就好像它们可能相同(“检查”),但您可以由于 Equals,根本不会进入 NullReferenceException(“路径”)。它称 x.Equals() 为“取消引用”,不幸的是使用 C/C++ 术语(出于历史原因)。

要修复代码中的错误并使 Coverity 满意,如 derHugo 在评论中所建议的,请将 RemoveAll 行更改为如下所示:

onsSelectedCredentials.RemoveAll(x => (x == null));

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...