Поделиться через


Подавление нарушений анализа кода

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

Подавление нарушений с помощью файла EditorConfig

В файле EditorConfig для вашего решения или проекта добавьте запись для каждого правила, которое требуется настроить, и установите уровень его серьезности на none. Например: dotnet_diagnostic.CA1822.severity = none. Для получения дополнительной информации см. раздел "Ручная настройка серьезности правил в файле EditorConfig". Сведения о добавлении файла EditorConfig см. в разделе "Добавление файла EditorConfig" в проект.

Подавление нарушений в исходном коде

Нарушения в исходном коде можно подавлять с помощью директивы препроцессора, которая подавляет нарушения для определенной строки кода:

Кроме того, можно использовать атрибут SuppressMessageAttribute для подавления предупреждения в коде C# и Visual Basic.

Подавление нарушений с помощью редактора кода

Чтобы отключить нарушения с помощью редактора кода, выполните следующие действия.

  1. Поместите курсор в строку кода с нарушением и нажмите клавиши CTRL+Period (.) или ALT+ВВОД , чтобы открыть меню "Быстрые действия ".

  2. Выберите Отключить или настроить проблемы>Отключить < номер правила>, а затем выберите в Источнике или в Источнике (атрибут).

    • Если вы выбрали в source, вы увидите предварительную версию директивы препроцессора, добавленной в код.

      Снимок экрана, показывающий выбор источника в меню

    • При выборе в source (атрибут) вы увидите предварительный просмотр атрибута SuppressMessageAttribute , добавленного в код.

      Снимок экрана: выбор источника (атрибута) в меню быстрого подавления действий.

Подавление нарушений с помощью списка ошибок

Чтобы отключить нарушения с помощью окна списка ошибок , выполните следующие действия.

  1. В окне списка ошибок выберите правила, которые нужно отключить.

  2. Щелкните правой кнопкой мыши и выберите "Отключить>в источнике".

    Откроется диалоговое окно "Предварительные изменения" и отображается предварительная версия директивы предупреждения #pragma C# или директивы предупреждения Visual Basic #Disable, добавленной в исходный код.

    Снимок экрана: диалоговое окно

  3. Нажмите кнопку "Применить" , чтобы сохранить изменения в файле кода.

Исключить диагностику построения списка ошибок

Если в окне "Список ошибок" не отображается параметр меню "Отключить", нарушение, скорее всего, происходит из сборки, а не динамический анализ. В окне списка ошибок отображаются ошибки диагностики или нарушения правил как из анализа динамического кода, так и сборок. Так как диагностика сборки может быть устаревшей, например, если вы редактировали код для исправления нарушения, но не перестроили его, вы не всегда можете отключить эти диагностики из списка ошибок.

Диагностика из динамического анализа или IntelliSense всегда up-to-date с текущими источниками и всегда может быть отложена из списка ошибок. Чтобы исключить диагностику сборки из вашего выбора, выполните следующие действия.

  1. В раскрывающемся списке фильтров ошибок измените выбор с Build + IntelliSense на IntelliSense Only.

    Снимок экрана, показывающий фильтр источника списка ошибок.

  2. Выберите диагностику, которую вы хотите отключить и продолжить, как описано ранее.

Устраните нарушения с использованием глобального файла подавления

Глобальный файл подавления использует атрибут SuppressMessageAttribute для подавления нарушений кода.

Используйте глобальный файл подавления из редактора кода

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

  1. В редакторе кода поместите курсор в строку кода с нарушением и нажмите клавиши CTRL+Period (.) или ALT+ВВОД , чтобы открыть меню "Быстрые действия ".

  2. Выберите "Подавить <номер> правила", а затем выберите в файле исключений.

    Visual Studio создает вкладку в редакторе кода, содержащего новый глобальный файл подавления.

Используйте глобальный файл подавления из списка ошибок

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

  1. В окне списка ошибок выберите правила, которые нужно отключить.

  2. Щелкните правой кнопкой мыши и выберите Подавить>В файле подавления.

    Откроется диалоговое окно "Предварительный просмотр изменений" и отображается предварительный просмотр атрибута SuppressMessageAttribute , добавленного в глобальный файл подавления.

    Снимок экрана: диалоговое окно

  3. Нажмите кнопку "Применить" , чтобы сохранить глобальный файл подавления.

Подавление всех текущих нарушений

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

  1. В строке меню Visual Studio выберите Анализ>Построить и подавить активные проблемы.

  2. Выберите Для решения для подавления нарушений для всего решения или выберите Для <имени проекта> для подавления нарушений только для вашего проекта.

Подавление нарушений с помощью параметров проекта

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

  1. В обозревателе решений выберите проект.

  2. Щелкните правой кнопкой мыши и выберите пункт "Свойства " (или нажмите клавиши ALT+ВВОД).

  3. В окне "Свойства" выберите " Анализ кода " на левой панели, а затем снимите флажок "Отключить результаты" из созданного кода.

Подавление нарушений с помощью набора правил

В редакторе набора правил снимите флажок рядом с его именем или установите Действие в положение Нет.

Подавление в источнике и атрибут SuppressMessageAttribute

Подавление в источнике (ISS) использует SuppressMessageAttribute атрибут для подавления предупреждения. Атрибут SuppressMessageAttribute можно добавить в исходный файл рядом с сегментом кода, который вызвал предупреждение.

Атрибут можно ввести вручную в редакторе кода или автоматически добавить атрибут следующим образом:

  1. В редакторе кода поместите курсор в строку кода с нарушением и нажмите клавиши CTRL+Period (.) или ALT+ВВОД , чтобы открыть меню "Быстрые действия ".

  2. Выберите Подавить или настроить ошибки>< в меню >.

  3. Выполните один из следующих шагов:

    • Выберите в поле Source (attribute).

      Visual Studio добавляет SuppressMessageAttribute атрибут в код.

    • Выберите в файле подавления.

      Visual Studio создает вкладку в редакторе кода, содержащую новый глобальный файл подавления с SuppressMessageAttribute атрибутами.

Атрибут SuppressMessageAttribute является условным атрибутом, который включается в метаданные сборки управляемого кода. Этот атрибут включается только в том случае, если CODE_ANALYSIS символ компиляции определен во время компиляции.

Только в коде C++ и CLI используйте макросы CA_SUPPRESS_MESSAGE или CA_GLOBAL_SUPPRESS_MESSAGE в файле заголовка для добавления атрибута.

При переносе проекта в последнюю версию Visual Studio может появиться большое количество предупреждений анализа кода. Если вы не готовы исправить предупреждения, вы можете отключить все из них, выбрав Анализ>Построить и подавить активные проблемы.

Замечание

Не используйте подавления в коде в релизных сборках, чтобы предотвратить случайную отправку метаданных подавления в исходных файлах.

Формат атрибута "SuppressMessageAttribute"

Атрибут SuppressMessageAttribute имеет следующий формат:

[Scope:SuppressMessage("Rule Category", "Rule Id", Justification = "Justification", MessageId = "MessageId", Scope = "Scope", Target = "Target")]

К свойствам атрибута относятся:

  • Category: Категория правила. Дополнительные сведения о категориях правил анализа кода см. в разделе "Правила качества кода".

  • CheckId: Идентификатор правила. Поддержка включает как короткое, так и длинное имя идентификатора правила. Короткое имя CAXXXX— длинное имя CAXXXX:FriendlyTypeName.

  • Justification: текст, используемый для документирования причины подавления сообщения.

  • MessageId: уникальный идентификатор проблемы для каждого сообщения.

  • Scope: целевой объект, на котором отключается предупреждение. Если целевой объект не указан, система устанавливает его в целевой объект атрибута. Поддерживаемые области включают:

    • module: Эта область подавляет предупреждения для сборки. Это глобальное подавление, которое применяется ко всему проекту.

    • resource: (Только устаревшая версия FxCop ) Эта область запрещает предупреждения в диагностических сведениях, записанных в файлы ресурсов, которые являются частью модуля (сборки). Эта область не считывается или учитывается в компиляторах C#/VB для диагностики анализатора Roslyn, которая анализирует только исходные файлы.

    • type: эта область охвата подавляет предупреждения против типа.

    • member: эта область подавляет предупреждения для члена.

    • namespace: Эта область подавляет предупреждения относительно самого пространства имен. Он не подавляет предупреждения о типах в пространстве имен.

    • namespaceanddescendants: (Требуется компилятор версии 3.x или выше и Visual Studio 2019 или выше) Эта область подавляет предупреждения в пространстве имен и во всех его производных символах. Устаревший анализ игнорирует значение namespaceanddescendants.

  • Target: идентификатор, указывающий целевой объект, на котором подавляется предупреждение. Он должен содержать полное имя компонента.

При появлении предупреждений в Visual Studio вы можете просмотреть примеры SuppressMessageAttribute, добавив подавление в глобальный файл подавлений. Атрибут подавления и его обязательные свойства отображаются в окне предварительного просмотра.

Использование атрибута SuppressMessageAttribute

Предупреждения анализа кода подавляются на том уровне, к которому применяется атрибут SuppressMessageAttribute. Например, атрибут можно применить на уровне сборки, модуля, типа, члена или параметра. Цель применения этого атрибута заключается в тесной привязке информации подавления к коду, в котором происходит нарушение.

Общая форма подавления включает категорию правил и идентификатор правила, который содержит необязательное удобочитаемое пользователем представление имени правила. Рассмотрим пример.

[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]

Если есть веские причины для сокращения метаданных подавления в исходных данных, имя правила может быть опущено. Категория правил и его идентификатор правила вместе образуют достаточно уникальный идентификатор правила. Рассмотрим пример.

[SuppressMessage("Microsoft.Design", "CA1039")]

По соображениям удобства обслуживания не рекомендуется указывать имя правила.

Подавление отдельных нарушений внутри тела метода

Атрибуты подавления могут применяться к методу, но не могут быть внедрены в текст метода. Все нарушения определенного правила подавляются при добавлении атрибута SuppressMessageAttribute в метод.

В некоторых случаях может потребоваться подавить конкретный случай нарушения. Рассмотрим пример, в котором будущий код не будет автоматически исключен из правила анализа кода. Некоторые правила анализа кода позволяют подавлять определенный экземпляр нарушения, используя свойство MessageId атрибута SuppressMessageAttribute. Как правило, существующие правила для нарушений, связанных с отдельными символами (такими как локальные переменные или параметры), учитывают свойство MessageId. CA1500:VariableNamesShouldNotMatchFieldNames является примером такого правила. Однако устаревшие правила для нарушений исполнения кода, который не является символом, не учитывают свойство MessageId. Кроме того, анализаторы платформы компилятора .NET ("Roslyn") не уважают MessageId свойство.

Чтобы подавить нарушение правила, связанное с конкретным символом, укажите имя символа для MessageId свойства атрибута SuppressMessageAttribute. В следующем примере показан код с двумя нарушениями CA1500:VariableNamesShouldNotMatchFieldNames: одно нарушение name переменной и другое нарушение переменной age . Только нарушение, связанное с символом age, подавляется.

public class Animal
{
    int age;
    string name;

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "age")]
    private void PrintInfo()
    {
        int age = 5;
        string name = "Charlie";

        Console.WriteLine($"Age {age}, Name {name}");
    }
}

Глобальные подавления

Средство анализа управляемого кода проверяет SuppressMessageAttribute атрибуты, применяемые на уровне сборки, модуля, типа, члена или параметра. Он также подает отчеты о нарушениях, связанных с ресурсами и пространствами имен. Эти нарушения должны применяться на глобальном уровне и быть четко определены и целенаправлены. Например, следующее сообщение подавляет нарушение пространства имен:

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

Для подавления глобального уровня:

  • При подавлении предупреждения с помощью области namespace, это подавляет предупреждение применительно к самому пространству имен. Он не подавляет предупреждение о типах в пространстве имен.

  • Target всегда содержит полностью квалифицированное имя элемента.

  • Любое подавление может быть выражено путем указания явной области. Эти настройки подавления должны находиться на глобальном уровне. Невозможно указать подавление на уровне элемента, изменив тип.

  • Подавление глобального уровня — единственный способ подавления сообщений, ссылающихся на созданный компилятором код, который не сопоставляется с явным образом предоставленным источником пользователя. Например, следующий код подавляет нарушение, связанное с конструктором, созданного компилятором:

    [module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

Глобальный файл подавления

Глобальный файл подавления поддерживает подавление, которое является либо подавлением глобального уровня, либо подавлением, которые не указывают целевой объект. Например, подавление нарушений на уровне сборки хранится в этом файле. Кроме того, некоторые ASP.NET подавления хранятся в этом файле, так как параметры уровня проекта недоступны для кода в форме. Visual Studio создает и добавляет глобальный файл подавления в ваш проект при первом выборе опции "Файл подавления в проекте" команды "Подавить" в окне "Список ошибок".

Область ограничений модуля

Вы можете подавить нарушения качества кода для всей сборки, используя область действия module.

Например, следующий атрибут в файле проекта GlobalSuppressions подавляет нарушение ConfigureAwait для проекта ASP.NET Core:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Reliability", "CA2007:Consider calling ConfigureAwait on the awaited task", Justification = "ASP.NET Core doesn't use thread context to store request context.", Scope = "module")]

Созданный код

Компиляторы управляемого кода и некоторые внешние средства создают код для быстрого разработки кода. Созданный компилятором код, который отображается в исходных файлах, помечается атрибутом GeneratedCodeAttribute .

Для анализа исходного кода можно отключить сообщения в созданном коде в файле editorconfig . Дополнительные сведения см. в разделе "Исключить созданный код".

Для анализа устаревшего кода можно выбрать, следует ли подавлять предупреждения и ошибки анализа кода для созданного кода. Сведения о подавлении таких предупреждений и ошибок см. в разделе "Подавление предупреждений анализа кода" для созданного кода.

Замечание

Анализ кода игнорируется GeneratedCodeAttribute , если он применяется ко всей сборке или одному параметру.