オーバーライドを使用して、独自のバージョンの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 ) );
これが私の省略された現在のオーバーライドですVisitMethodCall
。expression.NodeType
でない場合Literal
、またはCall
常にPop
2つのパラメーターのみを使用する場合。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エンジンのドキュメントはありません。