Есть ли способ идентифицировать неиспользуемые или устаревшие подавления сообщений FxCop?

Мы используем глобальные подавления FxCop для подавления нарушений правил, обнаруженных в старом коде. По старому коду я имею в виду код, который был написан иногда за несколько лет до того, как мы включили анализ кода. Мы исправляем нарушения в новом коде. Мы не можем исправлять нарушения в старом коде одновременно, поэтому мы используем подавления.

Со временем наши глобальные файлы подавления стали раздутыми. Часто, когда подпись изменилась по старому методу, предыдущее подавление становится недействительным, поскольку оно больше не совпадает с кодом. Мы создали новые подавления, чтобы игнорировать старые нарушения, но часто старые атрибуты SuppressMessage остались.

Кто-нибудь знает, как идентифицировать объявления SupressMessage, которые не соответствуют коду? В этом отношении кто-нибудь знает, как идентифицировать атрибуты SuppressMessage, которые являются недействительными, потому что нет нарушения для подавления?

Я думаю, что может быть сообщение с компилятором или FxCopCmd или сообщение журнала, которое может идентифицировать неиспользуемые запреты. Если нет, то кто-нибудь знает о script или VS-расширении, которое это делает?

Спасибо.

Ответ 1

Для этого вы можете использовать автономное приложение FxCop UI. Добавьте столбец "Виден последний прогон" на вкладку "Исключенные источники". После анализа этот столбец покажет ложное значение для любых подавлений в источнике, для которых соответствующее нарушение не было обнаружено во время анализа. Чтобы максимально повысить надежность результатов, вы должны убедиться, что используете тот же набор сборщиков правил для анализа, который вы используете при выполнении анализа из Visual Studio.

BTW, если вы хотите, чтобы у вас была возможность разбить вашу сборку, когда найдены "устаревшие" супрессии, вы можете подумать о голосовании на https://connect.microsoft.com/visualstudio/feedback/details/277253/add-mechanism-for-detecting-unnecessary-suppressmessageattribute-instances.