Форум программистов, компьютерный форум, киберфорум
HF
Войти
Регистрация
Восстановить пароль

Код-анализаторы

Запись от HF размещена 17.04.2021 в 18:01
Показов 5428 Комментарии 1

Описание
Анализаторы кода следят за качеством написанного кода. К этому относятся
  • code-quality - Такое как наличие дескрипторов методов, порядок следования параметров и методов в классе, потенциальные ошибки null и т.п.
  • code-style - Правила стиля кода
    • правила языка;
    • правила, касающиеся ненужного кода;
    • правила форматирования;
    • правила именования.
  • поиск антишаблонов в коде, с потенциальными критическими ошибками.

Анализаторы доступны в таких реализациях:
  • на уровне IDE
    VisualStudio имеет свой анализатор и по возмозможности предлагает выполнять замену или форматирование.
    IntelliSense предоставляет возможность сделать автозамену в известном ему коде. В остальном нужно делать самостоятельные изменения.
  • на уровне платформы
    .NetCore имеет встроенные набор анализаторов кода
    для .NetFramework нужно устанавливать внешние анализаторы
  • Сторонние, внешние программы
    Известный пример - ReSharper. Он имеет собственные анализаторы. Предлагает свои варианты замен и определяет коды ошибок, которые не предлагает VisualStudio. ReSharper хорошо интегрирован в VS и может как подавлять, так и работать совместно с VS.

Анализаторы, на уровне платформы, подключаются в проект в виде библиотек. Общепринятое пространство имён (namespace) "Microsoft.CodeAnalysis.*". Внешние могут иметь другие названия, но имеют слово "Analyzers".
Анализаторы есть для разных языков и типов приложений. Например, CSharp вставка есть у анализаторов со спецификой C#. Есть такие как WPF, VisualBasic и т.п.
Общепринятые коды ошибок - например CS0000, первые две буквы - код анализатора, а цифры - код ошибки. У VisualStudio коды - IDE0000. Найденные ошибки отображаются в панели "Error List".


Уровень ошибок
Уровень критичности ошибки влияет на компиляцию приложения. Компиляция считается ошибочной при наличии хотя бы одного Error. Исключение - IDE0000 ошибки, они не влияют на сборку.
Имеется 5 видов:
  • None - правило отключено
  • Silence - скрывать все сообщения
  • Suggestion - подсказывать. В VS закладка "Messages".
  • Warning - В VS закладка "Warning".
  • Error - В VS закладка "Error".

Использование
Список текущих анализаторов можно посмотреть в VisualStudio: "Solution Explorer" - "References" - "Analyzers".
Каждый анализатор раскрывается на список правил, входящий в этот анализатор.

Устаревший подход
Старый подход осуществлялся через настройку проекта. "Project Properties" - "Code Analysis".
  • Выбирался желаемый набор правил "Active rules"
  • Режим компиляции в котором запускался анализатор или выбранные правила
  • Флаг ипользования анализатора


Ruleset
Анализаторы использовали конфигурационные файлы с расширением ".ruleset". По умолчанию, использовался набор "Microsoft Managed Recommended Rules" (MinimumRecommendedRules.ruleset). Эти настройки находятся в папках VisualStudio и не доступны для редактирования. Если нужно изменить набор правил, то студия заставит сохранить файл в доступном каталоге и использовать его при сборке проекта. Пример файла конфигурации

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<RuleSet Name="My Common Rule Set" Description="Общий набор правил моего проекта" ToolsVersion="16.0">
    <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
        <Rule Id="CA1001" Action="Warning" />
        <Rule Id="CA1009" Action="Warning" />
        <Rule Id="CA1016" Action="Warning" />
        <Rule Id="CA1033" Action="Warning" />
        <Rule Id="CA2242" Action="Warning" />
    </Rules>
    <Rules AnalyzerId="Microsoft.CodeAnalysis.CSharp.Features" RuleNamespace="Microsoft.CodeAnalysis.CSharp.Features">
        <Rule Id="IDE0001" Action="Info" />
        <Rule Id="IDE0002" Action="Info" />
    </Rules>
</RuleSet>
Многие из анализаторов были признаны устаревшими, например "Microsoft.CodeAnalysis.FxCopAnalyze rs". Основные причины - анализаторы запускаются только при билде проекта; набор правил не актуален для синтаксиса последних версий языка и т.п..
При билде проекта в закладке "Warning" будет появляться сообщение:
CA0507 Post-build Code Analysis (FxCopCmd.exe) has been deprecated in favor of FxCop analyzers, which run during build. Refer to https://aka.ms/fxcopanalyzers to migrate to FxCop analyzers.
Ссылка: Migrate from legacy analysis (FxCop) to source analysis (.NET analyzers)
Совет - избавиться от FxCop анализаторов в пользу .NET Compiler Platform ("Roslyn") анализаторов. Рекомендуемым пакетом считается "Microsoft.CodeAnalysis.NetAnalyzers " (текущая версия 5.0.2).

Новый подход
Подключение анализатора
  • .NetCore имеет встроенные набор анализаторов кода.
    При создании проекта можно сразу обнаружить около 5 анализаторов: Microsoft.CodeAnalysis.*.CodeStyle, Microsoft.CodeAnalysis.*.NetAnalyzers.
  • Для .NetFramework нужно подключить из NuGet (искать по фразе "Microsoft.CodeAnalysis").
    Например, "Microsoft.CodeAnalysis.Analyzers", "Microsoft.CodeAnalysis.FxCopAnalyze rs", "StyleCop.Analyzers".

Устанавливаем рекомендуемый NuGet пакет "Microsoft.CodeAnalysis.NetAnalyzers"
В свойствах проекта (редактор csproj) появится ссылка на пакет. В настройках ссылки можно увидеть набор правил при которых работает этот анализатор. Он включает в себя много режимов, а не только build.
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Конфигурирование
После подключения, через какое-то время мы увидим обновлённую статистику ошибок в "Error List". Теперь нужно или исправить код или сконфигурировать уровень важности ошибки, чтобы не влиять на процесс разработки. В списке присутствует код ошибки и его описание. Можно нажать на ошибку, чтобы перейти в место возникновения и проанализировать.
Варианты изменения конфигурации
  • список анализаторов VisualStudio (см. выше). Достаточно выставить уровень правой кнопкой мыши
  • .editorconfig. Прописывается/изменяется строка правила.
  • .editorconfig. Редактор VisualStudio 2019 позволяет редактировать файл в UI режиме
  • интерактивно

.editorconfig
Новая возможность в "VisualStudio 2019" - управление конфигурацией анализаторов через конфигурационный файл. Аналог общего файла Resharper с настройками для командной разработки.
В нём могут содержаться настройки CodeStyle из настроек VS ("Text Editor" - "C#" - "CodeStyle") и управление уровнем правил анализаторов.
Файлы имеют возможность наследоваться в проектах. Если положить файл во внутренние каталоги с другими проектами, то правила из него автоматически применяются поверх конфигурации верхнего уровня (исключение, см. документацию
"root = true"). Пример нового вида настроек правил в файле конфигурации:
# IDE0049: Simplify Names
dotnet_diagnostic.IDE0049.severity = silent
Интерактивное изменение правил
При переходе на место возникновения ошибки, мы видим подсказку студии (или волнистая линия, или светлые точки). При нахождении курсора в строке, появляется возможность открыть контекстное меню (нажатие Ctrl+. или клик на "лампочку"). Внутри предоставлена возможность конфигурировать ошибку(-и) (или ошибки при наличии в строке больше одной рекомендации) - "Suppress or Configure issues"
  • Suppress - локальное подавление ошибки
    • через команду pragma
      C#
      1
      2
      3
      4
      5
      6
      
      public class Customer
      {
          #pragma warning disable SA1401 // Fields must be private
          public string Name;
          #pragma warning restore SA1401 // Fields must be private
      }
    • через атрибут SuppressMessage на члене класса, вызывавшего ошибку
      C#
      1
      2
      3
      4
      5
      
      public class Customer
      {
          [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Usage", "SA1401:Fields must be private", Justification = "Auto-generated")]
          public string Name;
      }
    • глобально через атрибут, применённого на assembly. С указанием члена класса к которому применяется правило (см. "GlobalSuppressions.cs").
      C#
      1
      2
      
      [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
          "StyleCop.CSharp.MaintainabilityRules", "SA1401:Fields must be private", Justification = "Due to legacy library reflection.", Scope = "member", Target = "~F:StyleCopDemo.Customer.Name")]
  • Configure severity - конфигурирование уровня важности ошибки. Достаточно выбрать нужный уровень, студия покажет изменения которые она внесёт в .editorconfig. Изменять также можно на всю ветку анализатора. Например, на все правила документации, или именования. Изменения вступают в силу моментально (зависит от скорости работы компьютера и VisualStudio).

Разное
Параметры компилятора C# для информирования об ошибках и предупреждениях
(см. ссылку "Параметры компилятора C# для информирования об ошибках и предупреждениях").
Можно управлять фильтрацией ошибок и изменением уровня критичности для конкретного проекта, а так же для конкретных видов сообщений. Выявляя любые потенциальные проблемы, или же наоборот для игнорирования ошибок, которые действительно не влияют на работу вашего приложения, а только "мусорят" логи компилятора.

Например, параметр "TreatWarningsAsErrors". Можно использовать для выявления любых потенциальных проблем.
  • "Project properties" - "Build"
  • "Treat warnings as errors"
    • None - ничего не менять (по умолчанию)
    • All - все Warning сообщения становятся (внезапно) критическими. Использовать для идеально качественного кода?
    • Specific warnings - уделять внимания только конкретным ошибкам. Указывается набор ошибок через ";"

Анализ требует генерации файла документации
Многие анализаторы используют генерацию XML файла, со списком всех членов сборки. Включая xdoc описание.
  • "Project properties" - "Build"
    • "Output" - "XML documentation file"
    • название файла автоматически сгенерируется
  • csproj
    Внутри файла появится подобная запись
    XML
    1
    2
    3
    
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        ...
        <DocumentationFile>$(OutputPath)$(AssemblyName).xml</DocumentationFile>

Проблемы
Компиляция успешна при наличии фатальных ошибок
Решение: Если это ошибки с кодом IDE****, то они не влияют на сборку. См. выше, общее описание.

Компиляция успешна при наличии фатальных ошибок
"Visual Studio" отображает фатальные ошибки, но компиляция успешна.
Решение: см. "Анализ требует генерации файла документации"

Компиляция успешна при наличии фатальных ошибок
Если не помогло изменение выше. Скорее всего компиляция проекта происходит в других режимах, на которые не установлены настройки анализатора. Например форсируется режим "x86", а конфигурация доступна только для "AnyCPU".
Решение: сделать правильные изменения в конфигурации.

В ErrorList критические ошибки, но в настройках ".editorconfig" они отключены
Вариант: Только начиная с "Visual Studio 2019 version 16.3" стало доступно конфигурирование анализаторов через ".editorconfig". До этой версии в конфиг файле можно было только хранить настройки code-style.

Ссылки
Миграция. Старые версии
Configuring StyleCop Analyzers
Миниатюры
Нажмите на изображение для увеличения
Название: NetAnalyzers-VSErrorList.png
Просмотров: 1127
Размер:	45.1 Кб
ID:	6940   Нажмите на изображение для увеличения
Название: NetAnalyzers-VSRuleSetSettings.png
Просмотров: 1063
Размер:	56.6 Кб
ID:	6941  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для HF
    Статья была навеяна длительными разборками причины этой ошибки и перехом со старого подхода на новый.
    Если кому-то инетерсно, то можно будет добавить статью по миграции.
    Конвертирование старого StyleCop.Settings на ruleset. Замена ruleset на конфиг. Обновление legacy StyleCop на вариант совместимый с NetAnalyzers.
    Запись от HF размещена 17.04.2021 в 18:10 HF вне форума
 
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru