Как игнорировать предупреждения в visual studio
Если вы используете Visual Studio в качестве среды разработки, в меню лампочки есть пункты, при выборе которых будет создан код для подавления предупреждений. Дополнительные сведения см. в разделе Подавление нарушений.
Отключение правила
При отключении правила анализа кода, которое вызывает предупреждение, вы отключаете правило для всего файла или проекта (в зависимости от области используемого файла конфигурации). Чтобы отключить правило, установите для него уровень серьезности none в файле конфигурации.
Дополнительные сведения об уровнях серьезности правил см. в разделе Настройка уровня серьезности правила.
Использование директивы препроцессора
Использование атрибута SuppressMessageAttribute
Вы можете использовать SuppressMessageAttribute, чтобы подавить предупреждение либо в исходном файле, либо в глобальном файле подавлений для проекта (GlobalSuppressions.cs или GlobalSuppressions.vb). Этот атрибут позволяет подавлять предупреждения только в определенных частях проекта или файла.
Два обязательных позиционных параметра для атрибута SuppressMessageAttribute — это категория правила и идентификатор правила. В следующем фрагменте кода передаются значения "Usage" и "CA2200:Rethrow to preserve stack details" для этих параметров.
При добавлении атрибута в глобальный файл подавлений вы указываете желаемый уровень для области подавления, например, "member" . API, в котором следует подавлять предупреждение, указывается с помощью свойства Target.
Используйте ИД документации для API-интерфейса, на который ссылаетесь в атрибуте Target . См. сведения о формате ИД документации.
Чтобы подавить предупреждения для кода, созданного компилятором, который не соответствует предоставленному явным образом исходному файлу пользователя, необходимо добавить атрибут подавления в глобальный файл подавлений. Например, следующий код подавляет нарушение в конструкторе, созданном компилятором:
warning
Количество подавляемых предупреждений компоновщика в диапазоне от 4000 до 4999.
Remarks
Предупреждение компоновщика | Message |
---|---|
LNK4017 | оператор keyword не поддерживается для платформы назначения; пропускается |
LNK4044 | параметр ' option ' не распознан; пропускается |
LNK4062 | option "" не совместим с конечным компьютером " architecture " параметр игнорируется |
LNK4075 | пропуск " option1 ", поскольку указано " option2 " |
LNK4086 | точка входа ' function ' не является __stdcall с ' number ' байт аргументов; образ может не работать |
LNK4088 | образ создается, поскольку указан параметр /FORCE; образ может не работать |
LNK4105 | не указан аргумент параметра ' option '; параметр пропускается |
LNK4203 | ошибка при чтении базы данных программы ' filename '; компоновка объекта без отладочной информации |
LNK4204 | в " filename " отсутствуют отладочные данные для ссылки на модуль; компоновка объекта производится как при отсутствии отладочной информации |
LNK4205 | в " filename " отсутствуют текущие отладочные данные для ссылки на модуль; компоновка объекта производится как при отсутствии отладочной информации |
LNK4206 | заранее скомпилированная информация о типе не найдена; ' filename ' не скомпонован или перезаписан; компоновка объекта без отладочной информации |
LNK4207 | " filename " скомпилировано с параметром/Yc/Yu/Z7; не удается создать PDB; перекомпилируйте с/Zi; компоновка объекта выполняется как при отсутствии отладочной информации |
LNK4208 | несовместимый формат PDB в ' filename '; удалите и заново соберите; компоновка объекта без отладочной информации |
LNK4209 | повреждена отладочная информация; заново скомпилируйте модуль; компоновка объекта без отладочной информации |
LNK4224 | option больше не поддерживается; пропускается |
LNK4228 | " option " недопустимо для библиотеки DLL; игнорируется |
LNK4229 | обнаружена недопустимая директива / directive ; пропускается |
Задание данного параметра компоновщика в среде разработки Visual Studio
Перейдите на страницу свойств Свойства конфигурации>Компоновщик>Командная строка.
Отфильтровав предупреждения компилятора одного или нескольких видов, вы сможете убрать лишнюю информацию из журнала сборки. Например, вы можете регулировать объем выходных данных, изменяя уровень детализации журнала сборки: обычный, подробный или диагностический. Дополнительные сведения о детализации см. в разделе Практическое руководство. Просмотр, сохранение и настройка файлов журнала сборки.
В обозревателе решений выберите проект, в котором вы хотите отключить предупреждения.
Перейдите на страницу Сборка.
В окне Отключить предупреждения через точку с запятой укажите коды предупреждений, которые вы хотите отключить.
Выполните повторную сборку решения.
Отключение некоторых предупреждений для C++
Используйте страницу свойств Свойства конфигурации, чтобы отключить конкретные предупреждения для проектов C++.
В обозревателе решений выберите проект или исходный файл, в котором хотите отключить предупреждения.
Выберите категорию Свойства конфигурации, категорию C/C++ и затем — страницу Дополнительно.
Выполните одно из следующих действий.
В окне Отключить некоторые предупреждения укажите разделенные точкой с запятой коды ошибок предупреждений, которые необходимо отключить.
В окне Отключить некоторые предупреждения щелкните Изменить, чтобы отобразить дополнительные параметры.
Отключение предупреждений для Visual Basic
Чтобы скрыть некоторые предупреждения компилятора для Visual Basic, измените VBPROJ-файл проекта. Чтобы отключить предупреждения определенной категории, используйте страницу свойств компилятора. Дополнительные сведения см. в статье Настройка предупреждений в Visual Basic.
Отключение некоторых предупреждений для Visual Basic
В этом примере показано, как отключить отдельные предупреждения компилятора настройками в VBPROJ-файле.
В обозревателе решений выберите проект, в котором вы хотите отключить предупреждения.
В строке меню выберите Проект > Выгрузить проект.
В обозревателе решений откройте контекстное меню для проекта и выберите пункт Изменить .vbproj.
XML-файл проекта откроется в редакторе кода.
Найдите элемент в используемой конфигурации сборки и добавьте в элемент один или несколько номеров предупреждений. Если вы указываете несколько номеров предупреждений, разделяйте их запятыми.
В следующем примере показан элемент для конфигурации сборки Debug на платформе x86, который подавляет вывод двух предупреждений компилятора.
Сохраните изменения в VBPROJ-файле.
В строке меню выберите Проект > Перезагрузить проект.
В строке меню последовательно выберите пункты Сборка > Перестроить решение.
В окне Вывод указанные предупреждения больше не отображаются.
Дополнительные сведения см. в описании параметра компилятора /nowarn для компилятора командной строки Visual Basic.
Отключение предупреждений для пакетов NuGet
В некоторых случаях нужно отключить предупреждения компилятора NuGet только для одного пакета NuGet, а не для всего проекта. Возможно, эти предупреждения нужны для конкретной цели, и вы не хотите отключать их на уровне проекта. Например, одно из предупреждений NuGet сообщает о неполной совместимости пакета с проектом. Если вы отключите его на уровне проекта, а затем добавить новый пакет NuGet, вы не сможете узнать о его возможной несовместимости.
Отключение определенных предупреждений для одного пакета NuGet
В обозревателе решений выберите пакет NuGet, для которого вы хотите отключить предупреждения компилятора.
Выберите Свойства в контекстном меню или в меню правой кнопки мыши.
В поле NoWarn свойств пакета введите номер предупреждения, который вы хотите отключить для этого пакета. Если вы намерены отключить несколько предупреждений, разделите их номера запятыми.
Теперь эти предупреждения исчезнут из обозревателя решений и списка ошибок.
Часто полезно указать, что предупреждение неприменимо. Подавление нарушений анализа кода означает, что участники команды проверили код, и предупреждение может быть подавлено. В следующих разделах описаны различные способы подавления нарушений анализа кода с помощью интегрированной среды разработки Visual Studio.
Подавление нарушений с помощью файла EditorConfig
В файле EditorConfig задайте уровень серьезности none , например dotnet_diagnostic.CA1822.severity = none . Сведения о добавлении файла EditorConfig см. в разделе "Добавление файла EditorConfig" в проект.
Подавление нарушений в исходном коде
Из редактора кода
Поместите курсор в строку кода с нарушением и нажмите клавиши CTRLPeriod+ (.), чтобы открыть меню быстрых действий. Выберите "Отключить CAXXXXXX", а затем в источнике или в источнике (атрибуте).
При выборе в источнике вы увидите предварительную версию директивы препроцессора, которая будет добавлена в код.
Если выбран параметр Source (attribute), вы увидите предварительный просмотр атрибута SuppressMessage , который будет добавлен в код.
Из списка ошибок
Выберите правила, которые нужно отключить, а затем щелкните правой кнопкой мыши и выберите "Отключить > источник".
В диалоговом окне предварительных изменений нажмите кнопку "Применить".
Если в Обозреватель решений не отображается параметр меню "Отключить", то нарушение, скорее всего, будет происходить из сборки, а не динамического анализа. В списке ошибок отображаются данные диагностики или нарушения правил как из анализа динамического кода, так и при сборке. Так как диагностика сборки может быть устаревшей, например, если вы отредактировали код для исправления нарушения, но не перестроили, эти данные диагностики нельзя отключить из списка ошибок. Диагностика из динамического анализа или IntelliSense всегда актуальна в текущих источниках и может быть подавлена из списка ошибок. Чтобы исключить диагностику сборки из выбранного фрагмента, переключите фильтр источника списка ошибок из сборки и IntelliSense только в IntelliSense. Затем выберите диагностику, которую нужно отключить и продолжить, как описано выше.
Подавление нарушений с помощью глобального файла подавления
В списке ошибок выберите правила, которые нужно отключить, а затем щелкните правой кнопкой мыши и выберите "Файл подавления > подавления". Откроется диалоговое окно "Предварительный просмотр изменений" и отображается предварительный просмотр атрибута, добавленного SuppressMessageAttribute в файл глобальных подавлений.
В редакторе кода поместите курсор в строку кода с нарушением и нажмите клавиши Quick Actions и refactorings (или нажмите клавиши CTRLPeriod+ (.)), чтобы открыть меню "Быстрые действия". Выберите "Отключить CAXXXXX", а затем в файле подавления. Вы увидите предварительный просмотр глобального файла подавления , который будет создан или изменен.
- В меню "Анализ" выберите "Анализ >сборки" и "Отключить активные проблемы" в строке меню, чтобы отключить все текущие нарушения. Подавление всех текущих нарушений иногда называется "базированием".
- В меню "Анализ" выберите "Анализ >" Code Analysis и "Отключить активные проблемы" в строке меню, чтобы отключить все текущие нарушения. Подавление всех текущих нарушений иногда называется "базированием".
Подавление нарушений с помощью параметров проекта
Подавление нарушений с помощью набора правил
В редакторе набора правил снимите флажок рядом с его именем или установите для действия значение None.
Подавление в источнике и атрибут SuppressMessage
Подавление в источнике (ISS) использует SuppressMessageAttribute атрибут для подавления предупреждения. Атрибут можно поместить рядом с сегментом кода, создающим предупреждение. Вы можете добавить атрибут в SuppressMessageAttribute исходный файл, введя его или используя контекстное меню в предупреждении в списке ошибок , чтобы добавить его автоматически.
Этот SuppressMessageAttribute атрибут является условным атрибутом, включенным в метаданные IL сборки управляемого кода. Этот атрибут включается только в том случае, если символ компиляции CODE_ANALYSIS определен во время компиляции.
В C++/CLI используйте макросы CASUPPRESSMESSAGE__ или CAGLOBAL__ SUPPRESS_MESSAGE в файле заголовка, чтобы добавить атрибут.
Для предотвращения случайной отправки метаданных подавления в исходном коде не следует использовать в сборках выпуска.
SuppressMessage - атрибут
При выборе команды "Отключить " в контексте или контекстном меню предупреждения анализа кода в списке ошибок атрибут добавляется либо в код, SuppressMessageAttribute либо в глобальный файл подавления проекта.
Атрибут SuppressMessageAttribute имеет следующий формат:
К свойствам атрибута относятся:
Категория — категория, в которой определено правило. Дополнительные сведения о категориях правил анализа кода см. в предупреждениях управляемого кода.
CheckId — идентификатор правила. Поддержка включает как короткое, так и длинное имя идентификатора правила. Короткое имя — CAXXXX; длинное имя — CAXXXX:FriendlyTypeName.
Область — целевой объект, на котором подавляется предупреждение. Если целевой объект не указан, он задается в качестве целевого объекта атрибута. Поддерживаемые области:
module — Эта область подавляет предупреждения для сборки. Это глобальное подавление, которое применяется ко всему проекту.
type — Эта область подавляет предупреждения для типа.
member — Эта область подавляет предупреждения для элемента.
namespace — Эта область подавляет предупреждения для самого пространства имен. Он не подавляет предупреждения о типах в пространстве имен.
namespaceanddescendants — (Требуется компилятор версии 3.x или более поздней и Visual Studio 2019) Эта область подавляет предупреждения в пространстве имен и всех его потомках. Значение namespaceanddescendants игнорируется устаревшим анализом.
Целевой объект — идентификатор, используемый для указания целевого объекта, на котором подавляется предупреждение. Он должен содержать полное имя компонента.
При отображении предупреждений в Visual Studio можно просмотреть примеры SuppressMessage , добавив подавление в глобальный файл подавления. Атрибут подавления и его обязательные свойства отображаются в окне предварительного просмотра.
Подавление использованияMessage
Code Analysis предупреждения подавляются на уровне, к которому SuppressMessageAttribute применяется атрибут. Например, атрибут может применяться на уровне сборки, модуля, типа, члена или параметра. Назначение этого атрибута заключается в тесной привязке сведений подавления к коду, в котором происходит нарушение.
Общая форма подавления включает категорию правила и идентификатор правила, который содержит необязательное удобочитаемое пользователем представление имени правила. Пример:
Если существуют строгие причины для минимизации метаданных подавления в источнике, имя правила можно опустить. Категория правила и его идентификатор правила вместе образуют достаточно уникальный идентификатор правила. Пример:
По соображениям удобства обслуживания не рекомендуется пропускать имя правила.
Подавление селективных нарушений в теле метода
Атрибуты подавления могут применяться к методу, но не могут быть внедрены в тело метода. Все нарушения определенного правила подавляются при добавлении атрибута SuppressMessageAttribute в метод.
В некоторых случаях может потребоваться отключить определенный экземпляр нарушения. Рассмотрим пример, в котором будущий код не будет автоматически исключен из правила анализа кода. Некоторые правила анализа кода позволяют подавлять определенный экземпляр нарушения с помощью MessageId свойства атрибута SuppressMessageAttribute . Как правило, устаревшие правила для нарушений определенного символа (локальной переменной или параметра) учитывают MessageId это свойство. CA1500:VariableNamesShouldNotMatchFieldNames является примером такого правила. Однако устаревшие правила для нарушений исполняемого кода (не символа) не учитывают MessageId это свойство. Кроме того, анализаторы .NET Compiler Platform ("Roslyn") не уважают MessageId свойство.
Чтобы отключить определенное нарушение символа правила, укажите имя символа для MessageId свойства атрибута SuppressMessageAttribute . В следующем примере показан код с двумя нарушениями CA1500:VariableNamesShouldNotMatchFieldNamesone— для переменной 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 всегда содержит полное имя элемента.
Глобальный файл подавления
Глобальный файл подавления поддерживает подавления, которые являются либо подавлениями глобального уровня, либо подавлениями, которые не указывают целевой объект. Например, подавления нарушений на уровне сборки хранятся в этом файле. Кроме того, некоторые ASP.NET подавления хранятся в этом файле, так как параметры уровня проекта недоступны для кода за формой. Глобальный файл подавления создается и добавляется в проект при первом выборе параметра "В Project файл подавления" команды "Отключить" в окне "Список ошибок".
Область подавления модулей
Вы можете отключить нарушения качества кода для всей сборки с помощью области модуля .
[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 .
Для анализа устаревшего кода можно выбрать, следует ли подавлять предупреждения и ошибки анализа кода для созданного кода. Сведения о подавлении таких предупреждений и ошибок см. в разделе "Практическое руководство. Подавление предупреждений для созданного кода".
Анализ кода игнорируется GeneratedCodeAttribute при применении ко всей сборке или одному параметру.
Обычная ситуация: вы написали кусок безупречно правильного кода, но 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, и в нем предупреждение уже выключено, то такая конструкция смысла не имеет, а могла просто достаться в наследство.
Что особенно приятно, эти ситуации возникают в самый подходящий момент – при переходе с одной версии компилятора на другую, при попытке включить в проект кучу стороннего кода, который и без того не прост в использовании, вторая ситуация просто приводит к подавлению предупреждения, в результате можно пропустить ошибку в коде, которая позже поможет пользователям получить премию Дарвина.
На самом деле, предупреждения нужно глушить так:
Первая конструкция сохраняет текущее состояние настроек предупреждений, вторая отключает нужное предупреждение, третья – восстанавливает сохраненное состояние. При этом состояние восстанавливается полностью – все сделанные уровнями выше изменения тоже восстанавливаются, предупреждения, выключенные по умолчанию, не включаются.
Выглядит страшно, но чего не сделаешь, чтобы не пропустить ту самую ошибку на миллиард.
Читайте также: