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


Общие сведения о подавлении в исходном коде

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

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

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

ПримечаниеПримечание

Кодировать данные атрибуты вручную не нужно.Для получения дополнительной информации см. Практическое руководство. Отключение предупреждений при помощи пункта меню.Для кода C++ этот пункт меню недоступен.

Атрибут SuppressMessage

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

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

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

[C++]

CA_SUPPRESS_MESSAGE("Rule Category", "Rule Id", Justification = "Justification", MessageId = "MessageId", Scope = "Scope", Target = "Target")

Где:

  • Rule Category — категория, в которой определяется правило.Дополнительные сведения о категориях правил анализа кода см. в разделе Анализ для предупреждений управляемого кода.

  • Rule Id — идентификатор правила.Поддерживается как короткое, так и полное имя идентификатора правила.Короткое имя выглядит следующим образом: CAXXXX. Полное имя выглядит следующим образом: CAXXXX:FriendlyTypeName.

  • Justification — текст причины подавления предупреждения.

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

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

    • Module

    • Пространство имен

    • Ресурс

    • Тип

    • Член

  • Target — идентификатор, используемый для обозначения объекта, в рамках которого подавляется предупреждение.Он должен содержать полное имя элемента.

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

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

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

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

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

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

Данный формат не рекомендуется из соображений сопровождаемости.

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

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

Imports System

Namespace InSourceSuppression
    Public Class Class1

        <System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", _
        "CA1801:ReviewUnusedParameters", MessageId:="cmdArgs")> _
        Shared Sub Main(ByVal cmdArgs() As String)

        End Sub

        <System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", _
        "CA1806:DoNotIgnoreMethodResults", MessageId:="System.Guid")> _
        Shared Function IsValidGuid(ByVal g As String) As Boolean 
            Try 
                Dim instance As New Guid(g) 'Causes CA1806: DoNotIgnoreMethodResults
                Return True 
            Catch e As ArgumentNullException
            Catch e As OverflowException
            Catch e As FormatException
            End Try 

            Return False 
        End Function 
    End Class 
End Namespace
using System;

namespace InSourceSuppression
{
    public class Class1
    {

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "args")]
        static void Main(string[] args) { }


        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
        "CA1806:DoNotIgnoreMethodResults", MessageId = "System.Guid")]
        public static bool IsValidGuid(string guid)
        {
            try
            {
              new Guid(guid); //Causes CA1806: DoNotIgnoreMethodResults 
              return true;
            }
            catch (ArgumentNullException) {}
            catch (OverflowException) {}
            catch (FormatException) {}
            return false;
        }
   }
}
using namespace System;

CA_SUPPRESS_MESSAGE("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId="args")
int main(array<System::String ^> ^args)
{
    return 0;
}

namespace InSourceSuppression
{
public ref class Class1
{
public:
       CA_SUPPRESS_MESSAGE("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", MessageId="System.Uri")
       static bool IsValidGuid(String^ uri)
       {
              try
              {
                     gcnew Uri(uri);
                     return true;
              }
              catch (ArgumentNullException^) {}
              catch (OverflowException^) {}
              catch (FormatException^) {}
              return false;
       }
};
}

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

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

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

Обратите внимание, что средство анализа кода пропускает атрибут GeneratedCodeAttribute, когда он применяется к целой сборке или к отдельному параметру.Такие ситуации возникают нечасто.

Подавления на глобальном уровне

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

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

ПримечаниеПримечание

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

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

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

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

ПримечаниеПримечание

Целевой объект всегда содержит полное имя элемента.

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

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

См. также

Ссылки

System.Diagnostics.CodeAnalysis