Coverity 问题:noescape:资源数据视图未关闭或保存在 Table.get

Coverity issue: noescape: Resource dataview is not closed or saved in Table.get

this.btnSaveChanges.Visible = false;        
//Error: alloc_fn: A new resource is returned from allocation method Grp_des.
//Error: var_assign: Assigning: dtv = resource returned from this.dal.Grp_des(this.sParent).
DataView dtv = dal.Grp_des("ABC"); 
**//error:  noescape: Resource dtv is not closed or saved in Table.get.**
DataRow dtr = dtv.Table.Rows[0];
lblTransferFrom.Text = "Job Transferred from:  " + HttpUtility.HtmlEncode(dtr[0].ToString());
//Error: leaked_resource: Variable dtv going out of scope leaks the resource it refers to.

这两个错误的具体指向是什么? 任何人都可以帮助我吗,提前谢谢你。

我可以解释消息的含义,包括 noescape

this.btnSaveChanges.Visible = false;        
//Error: alloc_fn: A new resource is returned from allocation method Grp_des.
//Error: var_assign: Assigning: dtv = resource returned from this.dal.Grp_des(this.sParent).
DataView dtv = dal.Grp_des("ABC"); 

alloc_fn 事件意味着 Coverity 认为 Grp_des 分配了必须释放的资源。然后 var_assign 表示资源由 dtv 变量指向。

**//error:  noescape: Resource dtv is not closed or saved in Table.get.**
DataRow dtr = dtv.Table.Rows[0];

noescape 事件仅供参考。 Coverity 表示,尽管 dtv 已传递给 Table.get,但该方法不会处理资源,也不会将其保存在字段中。因此,资源仍然分配,仍然需要处理。

这个特别的事件是出了名的令人困惑。静态分析术语 "escape" 描述了将值保存到字段或全局时发生的情况。 "noescape" 表示没有发生。

lblTransferFrom.Text = "Job Transferred from:  " + HttpUtility.HtmlEncode(dtr[0].ToString());
//Error: leaked_resource: Variable dtv going out of scope leaks the resource it refers to.

最后,leaked_resource 事件表明我们已经到达此方法的末尾,资源仍未被处理或保存以供以后处理。这通常很糟糕,因为在垃圾收集器回收关联的内存对象之前,资源不会被释放,这可能是从现在开始很长一段时间,同时某些东西可能会饿死相关资源。

直接的解决方法是在末尾添加 dtv.Dispose(); 或使用 using 语句以异常安全的方式自动进行处理。但是,当然,在没有看到其余代码的情况下,无法确定这是正确的修复。

(披露:我曾经为 Coverity/Synopsys 工作。)