0

我正在编写自定义 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。任何正确方向的指示将不胜感激!

4

1 回答 1

4

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

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

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

有没有给类型标识符System.String赋值的实例null

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

于 2012-05-22T15:51:03.863 回答