2016-11-09 101 views
6

我正在使用FxCopCmd工具進行靜態代碼分析。由於我們已經擁有龐大的代碼庫,因此我們使用FxCop附帶的baseline.exe工具來基準化現有問題。FxCop:異步方法的抑制消息

我在觀察,如果我添加一個新的方法到我的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.Design : Modify 'Program.d__0.MoveNext()' to catch a more specific exception than 'Exception' or rethrow the exception

爲了抑制 'CA1309 UseOrdinalStringComparison' 的問題,我說按照GlobalSuppression.cs抑制消息文件

[module: SuppressMessage("Microsoft.Globalization", "CA1309:UseOrdinalStringComparison", Scope="member", Target="ConsoleApplication1.Program.d__0.MoveNext()", MessageId="System.String.Equals(System.String,System.StringComparison)", Justification="")]

但是如果我在課堂上再添加一個方法,那麼這個抑制在消息停止工作。這是因爲method1是異步的,因此在編譯代碼中創建了一個新類(refer this)(在第一種情況下爲<method1>d__0)。但是當我在method1之前添加另一個方法時,編譯代碼中創建的新類名爲<method1>d__1。因此,抑制消息未應用,並且FxCop再次開始在代碼中顯示錯誤。

有什麼辦法可以永久性地抑制異步方法的FxCop錯誤嗎?

+0

即使在使用Visual Studio分析出現15k + FxCop問題的項目中,我也從未見過這種行爲。你有嘗試過嗎? –

+0

您確定該項目涉及異步方法嗎?行爲是由於編譯異步方法的代碼。 –

+0

是的,它有數百個異步方法。編輯:我剛剛再次運行FxCop,該行爲是不可重現的Visual Studio分析 –

回答

2

所以即使在設定賞金之後,問題仍未得到答覆。但是,我找到了解決方法(如果不是解決方案)。

上述問題是由於編譯器爲異步方法生成的代碼。由於FxCopCmd在dll上運行,因爲編譯器生成的代碼發生更改,所以現有的抑制消息將無用。但是,Visual Studio不會僅使用FxCopCmd來運行代碼分析。它智能地運行代碼分析,忽略異步方法。 (根據我的調查,它不會在異步方法上運行任何代碼分析,它必須是由於問題所致)

要獲得與CI構建中的Visual Studio相同的行爲,我們可以使用用於在代碼上運行FxCop分析的fxcoptask.dll。瞭解如何在構建中集成FxCop,請參閱this answer。這將解決問題中提到的問題。此外,它提供了很多定製選項。