繁体   English   中英

C# Coverity 在 RemoveAll 调用中提供“在 null 检查 (REVERSE_INULL) 之前取消引用”以从列表中删除 null 条目

[英]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 的误报还是我应该做些什么来解决这个问题?

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

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

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

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

C#列表<object> .RemoveAll() - 如何删除列表的子集?<div id="text_translate"><p> 我有两个具有多个匹配属性的<strong>feeds_Auto</strong>和<strong>Product</strong>类。 对于这个特殊问题,AutoID 是我需要使用的唯一字段。</p><p> 我有一个包含数百个<em>唯一</em>条目的List&lt;FeedsAuto&gt; 。 我有一个小List&lt;Product&gt;有 10、20 个<em>唯一</em>条目。 我现在想从大列表中删除小列表中的所有项目。</p><p> 如何使用 RemoveAll({lambda expression}) 来完成此操作? 我发现的所有示例都依赖于简单类型(字符串、整数等)的通用列表。</p><pre> private static int DoInserts(ref List&lt;Model.feeds_Auto&gt; source, ref List&lt;Model.Product&gt; target, Guid companyID) { List&lt;Model.Product&gt; newProductList = new List&lt;Model.Product&gt;(); List&lt;Model.Product&gt; dropSourceList = new List&lt;Model.Product&gt;(); using (var db = Helpers.GetProdDB()) { foreach (var src in source) { var tgt = target.Where(a =&gt; a.alternateProductID == src.AutoID &amp;&amp; a.LastFeedUpdate &lt; src.DateModified).FirstOrDefault(); if (tgt == null) { newProductList.Add(new Model.Product{...}); dropSourceList.Add(src); } } db.SaveChanges(); if (dropSourceList.Count &gt; 0) { source.RemoveAll(????); } } }</pre><p> 在循环中执行此操作并不困难:</p><pre> foreach (var drop in dropSourceList) { source.RemoveAll(a =&gt; a.AutoID == drop.AutoID); }</pre><p> (对我来说)循环一个集合以在每次传递中为一个项目调用 RemoveAll 只是没有意义。</p></div></object>

[英]C# List<object>.RemoveAll() - How to remove a subset of the list?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 空解除引用C# C#中的空解除引用控制 在C#中添加项目之前,如何确保/检查List是否为null? C# 取消引用可能的 null 引用 C#列表<object> .RemoveAll() - 如何删除列表的子集?<div id="text_translate"><p> 我有两个具有多个匹配属性的<strong>feeds_Auto</strong>和<strong>Product</strong>类。 对于这个特殊问题,AutoID 是我需要使用的唯一字段。</p><p> 我有一个包含数百个<em>唯一</em>条目的List&lt;FeedsAuto&gt; 。 我有一个小List&lt;Product&gt;有 10、20 个<em>唯一</em>条目。 我现在想从大列表中删除小列表中的所有项目。</p><p> 如何使用 RemoveAll({lambda expression}) 来完成此操作? 我发现的所有示例都依赖于简单类型(字符串、整数等)的通用列表。</p><pre> private static int DoInserts(ref List&lt;Model.feeds_Auto&gt; source, ref List&lt;Model.Product&gt; target, Guid companyID) { List&lt;Model.Product&gt; newProductList = new List&lt;Model.Product&gt;(); List&lt;Model.Product&gt; dropSourceList = new List&lt;Model.Product&gt;(); using (var db = Helpers.GetProdDB()) { foreach (var src in source) { var tgt = target.Where(a =&gt; a.alternateProductID == src.AutoID &amp;&amp; a.LastFeedUpdate &lt; src.DateModified).FirstOrDefault(); if (tgt == null) { newProductList.Add(new Model.Product{...}); dropSourceList.Add(src); } } db.SaveChanges(); if (dropSourceList.Count &gt; 0) { source.RemoveAll(????); } } }</pre><p> 在循环中执行此操作并不困难:</p><pre> foreach (var drop in dropSourceList) { source.RemoveAll(a =&gt; a.AutoID == drop.AutoID); }</pre><p> (对我来说)循环一个集合以在每次传递中为一个项目调用 RemoveAll 只是没有意义。</p></div></object> 方法调用中的C#null检查链 klocwork:在空检查之前可疑取消引用对象引用“ dt” 检查C#方法中list是否为null 如何从任何对象属性为null或为空的列表中删除All? 从对象的常规列表中删除所有空条目
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM