如何使用 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 是不是实际关闭?的主要内容,如果未能解决你的问题,请参考以下文章

FxCop 自定义规则检查命名空间

使用 SonarQube 自定义 Fxcop 规则

如何在 FxCop 的自定义规则中获取传递给方法的参数值?

fxcop 自定义规则 - 检查源代码以查找新关键字

忽略某些特定情况的内置 FxCop 规则。自定义 FxCop 规则?

自定义控件的 FxCop 自定义规则