1
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.

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

4

1 回答 1

2

我可以解释这些消息的含义,包括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,但该方法不会处理资源,也不会将其保存在字段中。因此,资源仍然被分配并且仍然需要被处置。

众所周知,这一特定事件令人困惑。静态分析术语“转义”描述了将值保存到字段或全局时发生的情况。“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 工作。)

于 2020-02-17T19:21:07.127 回答