0

オーバーライドを使用して、独自のバージョンのCA2241を実装しようとしていVisitMethodCallます。

String.Formatへの引数の数が5以下の場合に機能しますが、6つ以上の引数(フォーマット文字列を含む)がある場合は常に2つの引数のみが表示されます。

たとえば(MethodCall)call.Operands.Count、次の場合は正しいです。

Console.WriteLine( String.Format( "{0} {1}", 1, 2 ) );
Console.WriteLine( String.Format( "{0} {1} {2}", 1, 2, 3 ) );

...ただし、この場合は常に「2」のみを返します。

Console.WriteLine( String.Format( "{0} {1} {2} {3}", 1, 2, 3, 4 ) );
Console.WriteLine( String.Format( "{0} {1} {2} {3} {4}", 1, 2, 3, 4, 5 ) );

これが私の省略された現在のオーバーライドですVisitMethodCallexpression.NodeTypeでない場合Literal、またはCall常にPop2つのパラメーターのみを使用する場合。String.Formatそして、この状況は、への引数の数が6以上の場合にのみ発生します。

public override void VisitMethodCall( MethodCall call )
{
    MemberBinding mb = call.Callee as MemberBinding;
    if ( mb.BoundMember.FullName.StartsWith( "System.String.Format(" ) )
    {
        Expression expression = call.Operands[ 0 ];
        switch ( expression.NodeType )
        {
        case NodeType.Literal:
            // ...
            break;
        case NodeType.Call:
            // ...
            break;
        default: // always NodeType.Pop with two parameters
            // ...
        break;
        }
    }
    base.VisitMethodCall( call );
}

だから、私は何が間違っているのですか?また、CA2241ルールのソースは利用できますか?

前もって感謝します。

編集:私はこの記事を発見しました:http://blogs.msdn.com/b/codeanalysis/archive/2010/04/14/data-flow-analysis-rules-in-visual-studio-2010.aspx説明CC2241は新しいデータフロー分析エンジン(Pheonix)を使用して再実装されており、確かにdotPeekでメソッドを見つけることができました。残念ながら、私が見つけることができる新しいDFAエンジンのドキュメントはありません。

4

1 に答える 1

1

3つの代替値を取得すると、2つのオペランドしか表示されないのは、ターゲットがFormat(string format, params object[] args)String.Formatのオーバーロードを呼び出しているためです。args渡される代替値の数を知りたい場合は、パラメーター配列のサイズを調べる必要があります。

Microsoftが提供するFxCopルールに使用できるソースコードはなく、使用できるルールSDKもありません。それらがどのように構築されているかを知りたい場合は、逆コンパイラーを使用する必要があります(カスタムルールを作成する他のほとんどすべての人のように)。

于 2012-09-17T12:48:54.430 に答える