Как проверить, что DataReader на самом деле закрыт с помощью пользовательского правила FxCop? - PullRequest
3 голосов
/ 09 марта 2010

Я написал несколько пользовательских правил для FxCop 1.36.Я написал код, чтобы узнать, закрыт ли открытый DataReader или нет.Но он не проверяет, какой объект DataReader вызывает метод Close(), поэтому я не могу быть уверен, что все открытые объекты DataReader закрыты !!

2-й: Если я DataReader в 'if / else'like

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;
}

1 Ответ

0 голосов
/ 01 мая 2010

С FxCop это на самом деле очень сложно (если не возможно). Microsoft также узнала об этом, когда захотела добавить некоторые правила анализа безопасности в FxCop для VS2010. Проблема в том, что анализ потока данных в FxCop недостаточно хорош. По этой причине Microsoft создала новый механизм анализа, который действительно может это сделать. он называется Phoenix , но у меня только этот выпуск Visual Studio 2010 Ultimate содержит этот движок (бесплатной версии нет). Подробнее об этом здесь .

...