可用于FxCop规则CA2241的源实现(为格式化方法提供正确的参数)?

时间:2012-09-14 20:33:51

标签: fxcop

我正在尝试使用VisitMethodCall覆盖来实现我自己的CA2241版本。

如果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始终只有两个参数。只有当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引擎的文档。

1 个答案:

答案 0 :(得分:1)

一旦超过3个替换值,您只看到两个操作数的原因是目标正在调用String.Format的Format(string format, params object[] args)重载。如果您想知道传递了多少替换值,则需要检查args参数数组的大小。

Microsoft提供的FxCop规则没有可用的源代码,并且没有可用的规则SDK。如果你想了解它们是如何构建的,你需要使用反编译器(就像编写自定义规则的每一个人一样)。