Как игнорировать предупреждения в visual studio

Обновлено: 05.07.2024

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

Отключение правила

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

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

Использование директивы препроцессора

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

Вы можете использовать SuppressMessageAttribute, чтобы подавить предупреждение либо в исходном файле, либо в глобальном файле подавлений для проекта (GlobalSuppressions.cs или GlobalSuppressions.vb). Этот атрибут позволяет подавлять предупреждения только в определенных частях проекта или файла.

Два обязательных позиционных параметра для атрибута SuppressMessageAttribute — это категория правила и идентификатор правила. В следующем фрагменте кода передаются значения "Usage" и "CA2200:Rethrow to preserve stack details" для этих параметров.

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

Используйте ИД документации для API-интерфейса, на который ссылаетесь в атрибуте Target . См. сведения о формате ИД документации.

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

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

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

Перейдите на страницу Сборка.

В окне Отключить предупреждения через точку с запятой укажите коды предупреждений, которые вы хотите отключить.

Выполните повторную сборку решения.

Отключение некоторых предупреждений для C++

Используйте страницу свойств Свойства конфигурации, чтобы отключить конкретные предупреждения для проектов C++.

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

Выберите категорию Свойства конфигурации, категорию C/C++ и затем — страницу Дополнительно.

Выполните одно из следующих действий.

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

В окне Отключить некоторые предупреждения щелкните Изменить, чтобы отобразить дополнительные параметры.

Отключение предупреждений для Visual Basic

Чтобы скрыть некоторые предупреждения компилятора для Visual Basic, измените VBPROJ-файл проекта. Чтобы отключить предупреждения определенной категории, используйте страницу свойств компилятора. Дополнительные сведения см. в статье Настройка предупреждений в Visual Basic.

Отключение некоторых предупреждений для Visual Basic

В этом примере показано, как отключить отдельные предупреждения компилятора настройками в VBPROJ-файле.

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

В строке меню выберите Проект > Выгрузить проект.

В обозревателе решений откройте контекстное меню для проекта и выберите пункт Изменить <ProjectName>.vbproj.

XML-файл проекта откроется в редакторе кода.

Найдите элемент <NoWarn> в используемой конфигурации сборки и добавьте в элемент <NoWarn> один или несколько номеров предупреждений. Если вы указываете несколько номеров предупреждений, разделяйте их запятыми.

В следующем примере показан элемент <NoWarn> для конфигурации сборки Debug на платформе x86, который подавляет вывод двух предупреждений компилятора.

Сохраните изменения в VBPROJ-файле.

В строке меню выберите Проект > Перезагрузить проект.

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

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

Дополнительные сведения см. в описании параметра компилятора /nowarn для компилятора командной строки Visual Basic.

Отключение предупреждений для пакетов NuGet

В некоторых случаях нужно отключить предупреждения компилятора NuGet только для одного пакета NuGet, а не для всего проекта. Возможно, эти предупреждения нужны для конкретной цели, и вы не хотите отключать их на уровне проекта. Например, одно из предупреждений NuGet сообщает о неполной совместимости пакета с проектом. Если вы отключите его на уровне проекта, а затем добавить новый пакет NuGet, вы не сможете узнать о его возможной несовместимости.

Отключение определенных предупреждений для одного пакета NuGet

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

Пакет NuGet в обозревателе решений

Выберите Свойства в контекстном меню или в меню правой кнопки мыши.

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

Свойства пакета NuGet

Теперь эти предупреждения исчезнут из обозревателя решений и списка ошибок.

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

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

В файле EditorConfig задайте уровень серьезности none , например dotnet_diagnostic.CA1822.severity = none . Сведения о добавлении файла EditorConfig см. в разделе Добавление файла EditorConfig в проект.

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

В редакторе кода

Поместите курсор в строку кода с нарушением и нажмите клавишу CTRL + (.) , чтобы открыть меню быстрые действия . Выберите ПОДАВЛЯТЬ какскскскс, а затем выберите в источнике или в источнике (атрибут).

При выборе в поле Источник вы увидите предварительную версию директивы препроцессора, которая будет добавлена в код.

Подавлять диагностику в меню быстрых действий

Подавлять диагностику в меню быстрых действий

При выборе в поле Источник (атрибут) отображается предварительный просмотр атрибута SuppressMessage , который будет добавлен в код.

Подавлять диагностику в меню быстрых действий с помощью атрибута

Из Список ошибок

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

В диалоговом окне Просмотр изменений нажмите кнопку Применить.

Если в Обозреватель решений не отображается пункт подавить , то, скорее всего, это произошло из-за сборки, а не для интерактивного анализа. Список ошибок отображает диагностические или нарушения правил, как в реальном коде, так и в сборке. Так как диагностика сборки может быть устаревшей, например, если вы изменили код, чтобы устранить нарушение, но оно не было перестроено, вы не сможете отключить эти диагностические данные от Список ошибок. Диагностика из интерактивного анализа или IntelliSense всегда актуальны с текущими источниками и могут быть подавлены из Список ошибок. Чтобы исключить диагностику сборки из выбора, переключите фильтр источника Список ошибок с сборки + IntelliSense на IntelliSense. Затем выберите диагностику, которую необходимо отключить, и продолжайте, как описано выше.

Фильтр источника список ошибок в Visual Studio

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

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

Предварительный просмотр добавления атрибута SuppressMessage в файл подавления

В редакторе кода поместите курсор в строку кода с нарушением и нажмите клавиши быстрого действия и рефакторинга (или нажмите клавишу CTRL + period (. )), чтобы открыть меню быстрые действия . Выберите ПОДАВЛЯТЬ какскскскс, а затем выберите в файле подавления. Вы увидите предварительную версию файла глобального подавления , который будет создан или изменен.

  • В меню анализ выберите пункт анализировать > сборку и подавлять активные проблемы в строке меню, чтобы отключить все текущие нарушения. Иногда это называется "задания базовых показателей".
  • в меню анализ выберите анализировать > выполнение Code Analysis и подавлять активные проблемы в строке меню, чтобы отключить все текущие нарушения. Иногда это называется "задания базовых показателей".

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

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

В редакторе набора правил снимите флажок рядом с его именем или действием задать значение нет.

Подавление в исходном код и атрибут SuppressMessage

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

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

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

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

Выполнение анализа кода и отключение проблем в Visual Studio

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

SuppressMessage - атрибут

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

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

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

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

CheckId — идентификатор правила. Поддержка включает короткое и длинное имя для идентификатора правила. Короткое имя — КАКСКСКСКС; длинное имя — КАКСКСКСКС: Фриендлитипенаме.

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

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

type — Эта область подавляет предупреждения для типа.

member — Эта область подавляет предупреждения для элемента.

namespace — Эта область подавляет предупреждения относительно пространства имен. Он не отключает предупреждения для типов в пространстве имен.

namespaceanddescendants -(требуется компилятор версии 3. x или выше и Visual Studio 2019). эта область подавляет предупреждения в пространстве имен и всех его дочерних символах. namespaceanddescendants Значение игнорируется устаревшим анализом.

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

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

Использование SuppressMessage

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

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

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

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

Подавлять выборочные нарушения внутри тела метода

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

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

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

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

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

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

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

Target всегда содержит полное имя элемента.

Файл глобального подавления

Область подавления модуля

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

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

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

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

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

FAIL

Обычная ситуация: вы написали кусок безупречно правильного кода, но Visual C++ выдает на нем предупреждение. Часто можно немного переписать код, чтобы предупреждение ушло, но не всегда, и тогда выход один – глушить выдачу этого предупреждения.

Рассмотрим, какие возможности для этого есть в Visual C++ и какие ошибки допускают при их использовании.

Следующая возможность – запретить предупреждение в настройках проекта на уровне файла. Этот способ еще хуже предыдущего. Во-первых, предупреждение будет заглушено на всю единицу трансляции, т.е. в этом файле и всех заголовках, которые он включает. Во-вторых, точно те же проблемы с копированием кода, что и в прошлый раз. В третьих, как только в проекте оказывается больше нескольких файлов, вероятность потерять эту настройку при конверсии проекта под более новую версию Visual C++ становится равной чуть менее, чем единице.

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

1. устанавливает предупреждению уровень по умолчанию и
2. включает предупреждение.

Сначала уровни. В Visual C++ с каждым предупреждением связано число от 1 до 4 – это уровень предупреждения. Предупреждения уровня 1 считаются более серьезными, с ростом уровня серьезность якобы снижается. У каждого предупреждения есть уровень по умолчанию. Конструкция

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

У компилятора есть настройка, с какого уровня предупреждения показывать, Warning Level. При значении этой настройки, равном A, предупреждение в конкретной строке кода показывается только в том случае, если оно там разрешено и его уровень составляет A или ниже.

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

Зачем он это делает, если предупреждение и так выключено? Список предупреждений, выключенных по умолчанию, меняется от одной версии Visual C++ к другой – в него понемногу добавляются предупреждения. Если код изначально писали для Visual C++ 7, а там C9001 по умолчанию было включено, а теперь компилируют в Visual C++ 10, и в нем предупреждение уже выключено, то такая конструкция смысла не имеет, а могла просто достаться в наследство.

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

На самом деле, предупреждения нужно глушить так:

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

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

Читайте также:

[module name="footer"]