2016-11-09 2 views
6

Я использую инструмент FxCopCmd для анализа статического кода. Поскольку у нас уже была огромная база кода, мы установили существующие проблемы, используя baseline.exe инструмент, который поставляется с FxCop.FxCop: сообщение о пресечении для метода async

Я наблюдаю, что если я добавлю новый метод в свой класс 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="")]

Но если я добавлю еще один метод в класс, то это suppressi на сообщение перестает работать. Это связано с тем, что метод1 является асинхронным, и поэтому создается новый класс (refer this) в скомпилированном коде (который был <method1>d__0 в первом случае). Но когда я добавляю еще один метод перед методом1, новый класс, созданный в скомпилированном коде, называется <method1>d__1. Следовательно, сообщение подавления не применяется, и FxCop снова начинает показывать ошибки в коде.

Есть ли способ устранить ошибки FxCop для асинхронных методов на постоянной основе?

+0

Я никогда не видел такого поведения даже в проектах с проблемами 15k + FxCop с использованием анализа Visual Studio. Вы пробовали с этим? –

+0

Вы уверены, что проект включает асинхронные методы? Поведение связано с компиляцией кода асинхронных методов. –

+0

Да, у него были сотни асинхронных методов. EDIT: Я только что запустил FxCop, это поведение не воспроизводится при анализе Visual Studio –

ответ

2

Так что даже после настройки щедрости вопрос остался без ответа. Однако я нашел обходное решение (если не решение).

Указанная проблема связана с кодом, сгенерированным компилятором для асинхронных методов. Поскольку FxCopCmd работает в dll, поскольку код сгенерированного компилятора изменяется, существующие сообщения о подавлении становятся бесполезными. Однако Visual Studio не запускает анализ кода, просто используя FxCopCmd. Он выполняет анализ кода, разумно игнорируя асинхронные методы. (Согласно моему исследованию, он не запускает какой-либо анализ кода для асинхронных методов. Это должно быть связано с проблемой.)

Чтобы получить такое же поведение, как Visual Studio в сборках CI, мы можем использовать fxcoptask.dll для запуска анализа FxCop по коду. Обратитесь к this answer, чтобы узнать, как интегрировать FxCop в сборку. Это решит проблемы, упомянутые в проблеме. Кроме того, он дает множество вариантов настройки.

Смежные вопросы