FxCop: сообщение о подавлении асинхронного метода

Я использую инструмент FxCopCmd для статического анализа кода. Поскольку у нас уже была огромная кодовая база, мы выявили существующие проблемы с помощью инструмента 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: измените Program.d__0.MoveNext (), чтобы перехватить более конкретное исключение, чем Exception, или повторно выбросить исключение.

Чтобы подавить проблему CA1309 UseOrdinalStringComparison, я добавил следующее сообщение о подавлении в файл GlobalSuppression.cs

[модуль: SuppressMessage ("Microsoft.Globalization", "CA1309: UseOrdinalStringComparison", Scope = "member", Target = "ConsoleApplication1.Program.d__0.MoveNext ()", MessageId = "System.String.Equals (System.String, System.StringComparison) ", Justification =" ")]

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

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


person Gaurav Deshmukh    schedule 09.11.2016    source источник
comment
Я никогда не видел такого поведения даже в проектах с 15k + проблемами FxCop, использующими анализ Visual Studio. Вы пробовали с этим?   -  person Camilo Terevinto    schedule 17.11.2016
comment
Вы уверены, что в проекте используются асинхронные методы? Такое поведение связано с компиляцией кода асинхронных методов.   -  person Gaurav Deshmukh    schedule 17.11.2016
comment
Да, у него были сотни асинхронных методов. РЕДАКТИРОВАТЬ: Я только что снова запустил FxCop, это поведение не воспроизводится при анализе Visual Studio   -  person Camilo Terevinto    schedule 17.11.2016
comment
Я использую FxCopCmd   -  person Gaurav Deshmukh    schedule 17.11.2016
comment
Почему вы не используете Visual Studio? Что тебя останавливает?   -  person Camilo Terevinto    schedule 17.11.2016
comment
Я хочу интегрировать его в CI build.   -  person Gaurav Deshmukh    schedule 17.11.2016
comment
Разве вы не можете сначала убедиться, что Visual Studio работает правильно? Если этого не произойдет, вы, по крайней мере, узнаете, что это не проблема FxCopCmd.   -  person Camilo Terevinto    schedule 17.11.2016
comment
Я пробовал использовать этот фрагмент кода: namespace ConsoleApplication1 { class Program { string b = ""; public async Task<string> method1() { string a = ""; try { a.Equals("abc", StringComparison.InvariantCultureIgnoreCase); throw new NotSupportedException(); } catch (Exception) { Console.WriteLine("TP"); } return a; } static void Main(string[] args) { } } }   -  person Gaurav Deshmukh    schedule 17.11.2016
comment
Он показывает такое же поведение   -  person Gaurav Deshmukh    schedule 17.11.2016
comment
Я только 2 минуты смотрел на это, но мне неприятно видеть, что вопросы о наградах остаются без ответа. Не на 100%, но вы можете попробовать самоанализ. Ваше желание интегрировать это в сборку CI, я уверен, невозможно пока, см. Здесь: http://stackoverflow.com/questions/38993872/ - хороший вопрос, кстати   -  person Jeremy Thompson    schedule 24.11.2016


Ответы (1)


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

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

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

person Gaurav Deshmukh    schedule 28.11.2016