FxCop:异步方法的抑制消息



我使用FxCopCmd工具进行静态代码分析。由于我们已经有了一个庞大的代码库,我们使用FxCop附带的baseline.exe工具对现有问题进行基线化。

我观察到,如果我添加一个新方法到我的c#类,那么GlobalSuppression.cs文件中的一些抑制消息停止工作,我得到我没有触及的代码问题。

的例子:

namespace ConsoleApplication1
{
    class Program
    {
        public async Task<string> method1()
        {
            string a = "";
            a.Equals("abc", StringComparison.InvariantCultureIgnoreCase);
            return a;
        }
        static void Main(string[] args)
        {
        }        
    }
}

抛出以下错误:

CA1031: Microsoft。修改'Program.d__0.MoveNext()'捕获比' exception '更具体的异常,或者重新抛出除了

为了抑制'CA1309 UseOrdinalStringComparison'问题,我在GlobalSuppression.cs文件中添加了以下抑制消息

[模块:SuppressMessage("微软。"CA1309:UseOrdinalStringComparison", Scope="member",目标= " ConsoleApplication1.Program.d__0.MoveNext()",system . string,消息id = " System.String.Equals (System.StringComparison)",理由= " ")]

但是如果我在类中再添加一个方法,那么这个抑制消息停止工作。这是因为method1是异步的,所以在编译代码中创建了一个新类(参考这个)(在第一种情况下是<method1>d__0)。但是当我在method1之前添加另一个方法时,在编译代码中创建的新类被命名为<method1>d__1。因此,抑制消息不应用,FxCop再次开始显示代码中的错误。

是否有办法永久地抑制异步方法的FxCop错误?

所以即使设置了赏金,这个问题也没有得到回答。然而,我找到了变通方法(如果不是解决方案)。

提到的问题是由于编译器为异步方法生成的代码。由于FxCopCmd运行在dll上,随着编译器生成的代码被更改,现有的抑制消息变得无用。然而,Visual Studio并不仅仅通过使用FxCopCmd来运行代码分析。它可以智能地运行代码分析,忽略异步方法。(根据我的调查,它不会对异步方法进行任何类型的代码分析。这一定是由于问题的原因。

为了在CI构建中获得与Visual Studio相同的行为,我们可以使用fxcoptask.dll对代码运行FxCop分析。参考这个答案,了解如何在构建中集成FxCop。这将解决问题中提到的问题。此外,它还提供了许多自定义选项。

最新更新