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 工作。)
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 工作。)