如何使用 FxCop 自定义规则验证 DataReader 是不是实际关闭?
Posted
技术标签:
【中文标题】如何使用 FxCop 自定义规则验证 DataReader 是不是实际关闭?【英文标题】:How to validate DataReader is actually closed using FxCop custom rule?如何使用 FxCop 自定义规则验证 DataReader 是否实际关闭? 【发布时间】:2010-03-09 11:14:28 【问题描述】:我已经为 FxCop 1.36 编写了几个自定义规则。我编写了代码来查找打开的 DataReader 是否关闭的天气。但它不会检查哪个 DataReader 对象正在调用 Close()
方法,所以我无法确定是否所有打开的 DataReader 对象都已关闭!!
第二个:如果我是“if/else”中的 DataReader,例如
if 1=2
dr = cmd.ExecuteReader();
else
dr = cmd2.ExecuteReader();
end if
在这种情况下,它将搜索 2 个要关闭的 DataReader 对象。
为了更清楚,我将我的代码放在上面。
public override ProblemCollection Check(Member member)
Method method = member as Method;
int countCatch =0;
int countErrLog = 0;
Instruction objInstr = null;
if (method != null)
for (int i = 0; i < method.Instructions.Count; i++)
objInstr = method.Instructions[i];
if (objInstr.Value != null)
if (objInstr.Value.ToString()
.Contains("System.Data.SqlClient.SqlDataReader"))
countCatch += 1;
if (countCatch>0)
if (objInstr.Value.ToString().Contains(
"System.Data.SqlClient.SqlDataReader.Close"))
countErrLog += 1;
if (countErrLog!=countCatch)
Resolution resolu =
GetResolution(new string[] method.ToString() );
Problems.Add(new Problem(resolu));
return Problems;
【问题讨论】:
您还应该检查“Dispose()”,它也可以用于正确关闭 DataReader,尤其是在 using-Blocks 中。 @tanmay:你找到解决方案了吗?如果是,那么请添加这个问题的答案..这将是很大的帮助 【参考方案1】:对于 FxCop,这实际上非常困难(如果不可能的话)。当微软想为 VS2010 的 FxCop 添加一些安全分析规则时,他们也发现了这一点。问题是 FxCop 的数据流分析不够好。出于这个原因,微软构建了一个新的分析引擎,实际上可以做到这一点。它被称为Phoenix,但我只有 Visual Studio 2010 Ultimate 版包含这个引擎(没有可用的免费版本)。阅读更多关于它的信息here。
【讨论】:
是“凤凰引擎”。更多信息:blogs.msdn.com/codeanalysis/archive/2010/04/14/…. 啊,是的,凤凰引擎。谢谢以上是关于如何使用 FxCop 自定义规则验证 DataReader 是不是实际关闭?的主要内容,如果未能解决你的问题,请参考以下文章