[英]C# Coverity giving “Dereference before null check (REVERSE_INULL)” on a RemoveAll call to remove null entries from a list
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,但它已经在通向检查的所有路径上取消引用。” 该行代码的目的是读取列表中的当前值并删除任何已成为 null 的值,据我所知,没有发生 null 检查。 这是 Coverity 的误报还是我应该做些什么来解决这个问题?
如果x
是null
,则表达式x.Equals(null)
将抛出NullReferenceException
。 它永远不能评估为true
(除非Equals
已被覆盖以做一些奇怪的事情)。
Coverity 正确地告诉你这一点,尽管是以某种间接的方式。 具体来说,它理解Equals
旨在测试相等性,并且您将x
与null
进行比较,就好像它们可能相同(“检查”),但您无法进入Equals
(“路径”)都是因为NullReferenceException
。 它将x.Equals()
称为“取消引用”,不幸的是使用 C/C++ 术语(出于历史原因)。
要修复代码中的错误并让 Coverity 满意,正如 derHugo 在评论中所建议的那样,将RemoveAll
行更改为如下所示:
onsSelectedCredentials.RemoveAll(x => (x == null));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.