问题描述
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
是为了测试相等性,并且您将 x
与 null
进行比较,就好像它们可能相同(“检查”),但您可以由于 Equals
,根本不会进入 NullReferenceException
(“路径”)。它称 x.Equals()
为“取消引用”,不幸的是使用 C/C++ 术语(出于历史原因)。
要修复代码中的错误并使 Coverity 满意,如 derHugo 在评论中所建议的,请将 RemoveAll
行更改为如下所示:
onsSelectedCredentials.RemoveAll(x => (x == null));