Пользовательское правило StyleCop: получение типа переменной при проверке назначений

Я пишу пользовательское правило StyleCop, чтобы предотвратить присвоение String переменных null, и столкнулся с проблемой!

Я могу легко предотвратить присвоение переменной String null во время объявления с помощью следующего кода:

if (expression.ExpressionType == ExpressionType.VariableDeclarator)
{
    VariableDeclaratorExpression variableDeclarator = ((VariableDeclaratorExpression)expression);

    if (variableDeclarator.Initializer == null)
    {
        if ((parentStatement.StatementType != StatementType.Catch) &&
            (parentStatement.StatementType != StatementType.Foreach))
        {
            this.AddViolation(parentElement, expression.LineNumber, "InitialiseVariablesOnDeclaration");
        }
    }
    else
    {
        Boolean isString = false;

        foreach (CsToken token in variableDeclarator.ParentVariable.Tokens)
        {
            if ((token.Text.Equals("String")) || (token.Text.Equals("string")))
            {
                isString = true;
                break;
            }
        }

        if (isString)
        {
            foreach (CsToken token in variableDeclarator.Initializer.Tokens)
            {
                if (token.CsTokenType == CsTokenType.Null)
                {
                    this.AddViolation(parentElement, expression.LineNumber, "DoNotAssignStringsToNull");
                    break;
                }
            }
        }
    }
}

(Обратите внимание, что этот код также проверяет, что переменные присваиваются явно при их объявлении).

У меня возникли проблемы с проверкой String переменных, которым присваивается null после их объявления. API StyleCop, похоже, не предоставляет никакого механизма для поиска типа переменной в левой части оператора присваивания.

Следовательно, этот код запускает правило, которое у меня есть только что:

String someString = null;

Но этот код не:

String someOtherString = String.Empty;
someOtherString = null;

В настоящее время я использую StyleCop версии 4.7.19.0. Любые указатели в правильном направлении будут с благодарностью получены!


person Mike Insch    schedule 21.05.2012    source источник
comment
На самом деле это не правило StyleCop; это больше похоже на правило FxCop.   -  person Michael Edenfield    schedule 21.05.2012
comment
Хороший вопрос ... Я еще не начал изучать настройки FxCop, я посмотрю сегодня днем.   -  person Mike Insch    schedule 21.05.2012
comment
@MichaelEdenfield - Большое спасибо, правило FxCop помогло...   -  person Mike Insch    schedule 22.05.2012
comment
Хорошо знать. Я добавлю ответ, объясняющий разницу для всех, у кого могут быть похожие проблемы.   -  person Michael Edenfield    schedule 22.05.2012


Ответы (1)


Правила StyleCop предназначены для обеспечения соблюдения надлежащих стандартов форматирования исходного кода. Их интересует только ваш исходный код в виде текста: пунктуация, пробелы, орфография и т. д. Правила StyleCop имеют доступ к вашему исходному коду в том виде, в каком он существует, до того, как к нему доберется компилятор. В некотором смысле это хорошо, потому что позволяет StyleCop применять вещи, которые не имеют смысла для компилятора, такие как размещение фигурных скобок, запятых или пробелов, порядок пространств имен или наличие комментариев.

Однако то, о чем вы просите, требует более глубокого анализа, который понимает семантическое значение токенов и может отслеживать это значение для данного токена, как оно появляется в вашем коде. Это область статического анализа кода (ранее FxCop), который происходит после компиляции обработки вашего исходного кода в IL. Статический анализ кода знает об элементах языка: типах, операторах, идентификаторах и т. д. Он может выполнять анализ потока программы, проверку типов и другие операции, которые зависят от компилятора, уже обработавшего текст вашего исходного кода в элементы языка.

В этом случае вопрос, который вы пытаетесь задать, заключается в следующем:

Есть ли случаи, когда идентификатору типа System.String присваивается значение null?

Этот вопрос требует знания типов каждого идентификатора и способности следовать этому типу по мере прохождения вашей функции. Это правило анализа кода, а не правило стиля, поэтому для его обработки вам потребуется создать собственное правило ЦС.

person Michael Edenfield    schedule 22.05.2012