【问题标题】:C# Coverity giving "Dereference before null check (REVERSE_INULL)" on a RemoveAll call to remove null entries from a listC# Coverity 在 RemoveAll 调用中提供“在空检查之前取消引用 (REVERSE_INULL)”以从列表中删除空条目
【发布时间】:2021-03-29 17:54:49
【问题描述】:
 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 表明它可能为空,但它已经在通向检查的所有路径上被取消引用。”那行代码的目的是读取列表中的当前值并删除任何已变为空的值,据我所知,没有发生空值检查。这是 Coverity 的误报还是我应该做些什么来解决这个问题?

【问题讨论】:

标签: c# unity3d coverity


【解决方案1】:

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

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

要修复代码中的错误并让 Coverity 满意,正如 derHugo 在评论中所建议的那样,将 RemoveAll 行更改为如下内容:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2011-01-25
    • 1970-01-01
    • 2018-11-03
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多