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

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

Запись от HF размещена 17.04.2021 в 18:01
Показов 5403 Комментарии 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
Просмотров: 1121
Размер:	45.1 Кб
ID:	6940   Нажмите на изображение для увеличения
Название: NetAnalyzers-VSRuleSetSettings.png
Просмотров: 1053
Размер:	56.6 Кб
ID:	6941  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для HF
    Статья была навеяна длительными разборками причины этой ошибки и перехом со старого подхода на новый.
    Если кому-то инетерсно, то можно будет добавить статью по миграции.
    Конвертирование старого StyleCop.Settings на ruleset. Замена ruleset на конфиг. Обновление legacy StyleCop на вариант совместимый с NetAnalyzers.
    Запись от HF размещена 17.04.2021 в 18:10 HF вне форума
 
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru