StyleCop自定义规则:检查分配时获取变量的类型

时间:2012-05-21 12:05:13

标签: c# 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时遇到问题,StyleCop API似乎没有暴露任何机制来查找左侧的变量类型转让声明。

因此,此代码触发了我刚才的规则:

String someString = null;

但是这段代码没有:

String someOtherString = String.Empty;
someOtherString = null;

我目前正在使用StyleCop版本4.7.19.0。我们将非常感激地收到正确方向的任何指示!

1 个答案:

答案 0 :(得分:4)

StyleCop规则旨在强制执行正确的源代码格式标准。它们只对您的源代码感兴趣,如文本:标点符号,间距,拼写等.StyleCop规则可以访问源代码,因为它在编译器到达之前就已存在。在某些方面,这很好,因为它允许StyleCop强制执行对编译器毫无意义的事情,例如花括号,逗号或空格的位置,命名空间的顺序或注释的存在。

然而,您要求的是需要更深入的分析形式,该分析能够理解令牌的语义含义,并且可以跟踪代码中出现的给定令牌的含义。这是静态代码分析(以前称为“FxCop”)的领域,在编译器将源代码处理为IL之后发生。静态代码分析了解语言元素:类型,运算符,标识符等。它可以执行程序流分析,类型验证以及依赖于编译器已将源代码文本处理为语言元素的其他操作。

在这种情况下,您要问的问题是:

  

是否有任何类型System.String的标识符被赋予null值的情况?

该问题需要知道每个标识符的类型,并且能够在流程通过您的函数时遵循该类型。这是一个代码分析规则,而不是样式规则,因此您需要构建一个自定义CA规则来处理它。