0

String変数が割り当てられないようにカスタムStyleCopルールを作成してい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あります。StyleCopAPIは、割り当てステートメントの左側にある変数の型を見つけるメカニズムを公開していないようです。

したがって、このコードは、私が今持っているルールをトリガーします。

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 に答える