10 ноября 2020 года Microsoft выпустила новую версию .NET Core — .NET 5. В обновленной платформе появилось множество новых улучшений. Например, он позволяет разработчикам C# использовать возможности нового C# 9: записи, реляционное сопоставление с образцом и т. д. К сожалению, был недостаток: PVS-Studio не могла анализировать эти проекты. Однако (и вот хорошая новость)… Раньше так и было :) Наш следующий релиз, PVS-Studio 7.13, будет поддерживать проекты, ориентированные на .NET 5.

Он же .NET Core 4

.NET 5 — это следующий шаг после .NET Core 3.1. Мы видим, что Microsoft изменила название с .NET Core на .NET. Это должно показать, что они будут фокусироваться на этой платформе в дальнейшем. Собственно Microsoft подтвердила это на своем официальном сайте — они уже выложили там три превью-версии .NET 6.

Но почему номер версии изменился с 3.1 на 5? Это не кажется удивительным — помните, как Windows 10 последовала за Windows 8.1? :)

На самом деле Microsoft пропустила номер 4, чтобы избежать путаницы между .NET Framework и .NET. Однако «Entity Framework Core 5.0», основанный на .NET 5, сохранит постфикс «Core». В противном случае было бы невозможно провести различие между версиями Core и Framework «Entity Framework 5.0».

.NET 5 предоставляет разработчикам множество новых инструментов. Например, C# теперь предлагает улучшенный механизм сопоставления с образцом. Кроме того, есть эта необычная и интересная функция, которая позволяет вам писать код вне функций или классов. Не каждому разработчику нужна эта возможность, но она обязательно привлечет некоторых поклонников. Полный список улучшений C# 9 доступен на официальном сайте Microsoft.

О новых возможностях .NET 5 можно прочитать здесь.

PVS-Studio и .NET 5

Мы получили много запросов от наших клиентов на поддержку проектов .NET 5. Мы также понимали, что анализатор должен поддерживать последние инновации. Однако, несмотря на важность, новые версии .NET не являются единственным направлением развития PVS-Studio. Вот почему нам потребовалось некоторое время, чтобы представить нашу новую версию, которая поддерживает проекты .NET 5.

Обновление касается версий нашего анализатора для Windows, Linux и macOS. PVS-Studio для Windows по-прежнему требует наличия .NET Framework 4.7.2. В Linux и macOS для анализатора теперь требуется .NET 5. Раньше было достаточно .NET Core 3.1.

Почему мы перевели анализатор для Linux и macOS на .NET 5?

Наш первоначальный план состоял в том, чтобы позднее переключить анализатор с .NET Core 3.1 на .NET 5. Однако это пришлось изменить, когда мы столкнулись с проблемой.

При анализе проектов для .NET Core или .NET 5 PVS-Studio активно взаимодействует с SDK соответствующей версии. Сложность заключается в том, что библиотеки .NET 5 SDK зависят от библиотеки «System.Runtime» версии .NET 5. Между тем, если анализатор нацелен на .NET Core 3.1, он загружает библиотеку «System.Runtime» версии 3.1. В итоге мы постоянно получали конфликт — анализатор не мог взаимодействовать с библиотекой SDK, и анализ был невозможен.

Переход с .NET Core на .NET 5 полностью решил эту проблему. :)

Мгновенные улучшения

Для поддержки анализа проекта .NET 5 нам нужно было обновить некоторые зависимости. В частности, PVS-Studio теперь использует более новые версии Roslyn и MSBuild. Это позволяет анализатору корректно обрабатывать код, использующий возможности C# 9. Например, приведенный ниже код может вызывать ложные предупреждения:

user = user with { Name = "Bill" }

Анализатор не имел никакой информации о WithExpression — и поэтому не мог корректно обработать этот код. В результате анализатор выдал предупреждение о том, что переменная user присвоена самой себе. Разумеется, отчет об анализе также содержал предупреждение о том, что анализатор не поддерживает этот проект. Однако от последнего дело не облегчилось. :( К счастью, новое обновление устранило проблему автоматически. Остальные проблемы пришлось исправлять вручную.

Проблемы с новыми версиями

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

Одной из новых — и проблемных — функций C# являются операторы верхнего уровня. Работая над анализатором C#, мы ожидали, что локальные переменные, условия, циклы и т. д. всегда находятся внутри методов. Теперь, когда вы можете писать код C# даже без объявления класса… Очевидно, это очень интересно, но создает нам некоторые проблемы. Хотя мы сомневаемся, что все разработчики начнут писать весь код вне классов. :)

Еще одна новая функция, которая побудила нас изменить код нашего инструмента, — это метод доступа init. Пришлось переработать диагностическое правило V3140.

Правило срабатывает, когда методы доступа к свойству используют разные внутренние переменные. Пример кода ниже (из статьи RunUO Check) запускает эту диагностику:

private bool m_IsRewardItem;
[CommandProperty( AccessLevel.GameMaster )]
public bool IsRewardItem
{
  get{ return m_IsRewardItem; }
  set{ m_IsRewardItem = value; InvalidateProperties(); }
}
private bool m_East;
[CommandProperty( AccessLevel.GameMaster )]
public bool East                                       // <=
{
  get{ return m_East; }
  set{ m_IsRewardItem = value; InvalidateProperties(); } 
}

PVS-Studio предупреждает: средства доступа к свойствам V3140 используют разные вспомогательные поля. WallBanner.cs 77

При написании диагностики V3140 мы исходили из того, что свойство может иметь только два аксессора — get и set. Новый метод доступа init превзошел все ожидания. Это приводило не только к некорректной работе диагностики — диагностика постоянно вылетала и выдавала исключение! К счастью, мы обнаружили эту проблему при тестировании и успешно ее исправили.

Не могу дождаться релиза?

Вам не нужно ждать! Конечно, сейчас до релиза осталось не так уж и много времени, но все же… Не хотите ли поскорее опробовать новую версию? Нет проблем — мы готовы помочь! Перейдите на страницу обратной связи и запросите новую версию. Мы постараемся ответить как можно скорее — а значит скоро вы сможете анализировать свои (и не только ваши) .NET 5 проекты!

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