﻿# PVS\-Studio 7\.21: GitLab Code Quality, Unreal Engine

Вышел новый релиз PVS\-Studio – 7\.21\. В этой заметке описали основные улучшения анализатора и собрали материалы от нашей команды, вышедшие в последнее время: статьи, опросы и записи докладов с конференций\.

![1000_Release_7_21_ru/image1.png](https://import.viva64.com/docx/blog/1000_Release_7_21_ru/image1.png)

**Загрузить PVS\-Studio 7\.21** можно [тут](https://pvs-studio.ru/ru/pvs-studio/download/)\. Если нет лицензионного ключа, получить триал можно [здесь](https://pvs-studio.ru/ru/pvs-studio/download/)\.

Итак, что же нового?

**Отчёты PVS\-Studio, совместимые с GitLab Code Quality**

![1000_Release_7_21_ru/image2.png](https://import.viva64.com/docx/blog/1000_Release_7_21_ru/image2.png)

Результаты работы PVS\-Studio теперь можно сконвертировать в отчёт, совместимый с GitLab Code Quality\. Это поможет следить за качеством проекта в рамках экосистемы GitLab\. 

В документации по использованию PVS\-Studio в GitLab CI/CD [описали](https://pvs-studio.ru/ru/docs/manual/0056/#ID0BA78EAC23), как получить такой отчёт\.

**Более тесная интеграция с Unreal Engine**

Мы продолжаем развивать поддержку проектов на основе Unreal Engine\. В этот раз сразу три новости:

1. Научили анализатор понимать ещё больше типов, специфичных для Unreal Engine проектов\. Хороших срабатываний должно стать больше, ложных – меньше\.
1. В документации [описали](https://pvs-studio.ru/ru/docs/manual/0043/#IDFBE2B5765F), как с помощью PVS\-Studio проверять Unreal Engine проекты под Linux\.
1. Сделали pull request, который позволит использовать больше настроек анализатора при работе с UE\-проектами\. Например, указывать таймаут для анализа файлов\. Изменения уже закоммичены в код движка и будут доступны в следующей версии Unreal Engine\. 

**Улучшение кроссплатформенных сценариев работы**

Плагин PVS\-Studio для Visual Studio теперь умеет работать с файлами подавления в формате JSON \(ранее формат поддерживался только утилитах в Linux и macOS\)\. Это упрощает кроссплатформенные сценарии работы с подавленными предупреждениями\. Внедрить PVS\-Studio в кроссплатформенные проекты с legacy\-кодом также станет легче\.

**Новые возможности подавления предупреждений**

Теперь вы можете автоматически фильтровать предупреждения анализатора, сообщения которых содержат определённый текст\. Это позволит подавлять предупреждения по шаблону, не отключая диагностики целиком\. Описать такой фильтр можно в [\.pvsconfig\-файлах](https://pvs-studio.ru/ru/docs/manual/6630/) \(C\+\+, C\#\) или прямо в коде \(только C\+\+\)\.

Рассмотрим пример\. Диагностика [V3022](https://pvs-studio.ru/ru/docs/warnings/v3022/) C\# анализатора PVS\-Studio выдаёт предупреждение, если выражение в коде всегда истинно или ложно\. 

Взглянем на фрагмент кода:

```cpp
static void ProcessStr(String str)
{
  if (str == "temp")
  {
    if (str.Length != 0) // V3022 (expression is always true)
      ....
    
    if (str.Length == 0) // V3022 (expression is always false)
      ....
  }
}
```

Допустим, мы не хотим выключать диагностику V3022 целиком, но хотим видеть только предупреждения на условия, которые всегда ложны\. Для этого достаточно записать в \.pvsconfig\-файл такой фильтр:

```cpp
//-V::3022::{always true}
```

PVS\-Studio отфильтрует предупреждения V3022, которые содержат текст "always true"\. На примере кода выше первое предупреждение пропадёт, а второе останется\.

**Документация по файлам конфигурации диагностик \(\.pvsconfig\)**

Файлы конфигурации диагностик позволяют конфигурировать поведение анализатора, например:

* изменить уровень диагностик;
* исключить из результатов анализа предупреждения по определённому паттерну;
* изменить текст предупреждения и т\.п\.

В новом разделе [документации](https://pvs-studio.ru/ru/docs/manual/6630/) мы описали все возможности \.pvsconfig\-файлов и способы работы с ними в разном окружении\.

**Новые диагностики**

C, C\+\+

* [V1090](https://pvs-studio.ru/ru/docs/warnings/v1090/)\. The 'std::uncaught\_exception' function is deprecated since C\+\+17 and is removed in C\+\+20\. Consider replacing this function with 'std::uncaught\_exceptions'\.
* [V1091](https://pvs-studio.ru/ru/docs/warnings/v1091/)\. The pointer is cast to an integer type of a larger size\. Casting pointer to a type of a larger size is an implementation\-defined behavior\.
* [V1092](https://pvs-studio.ru/ru/docs/warnings/v1092/)\. Recursive function call during the static/thread\_local variable initialization might occur\. This may lead to undefined behavior\.

C\#

* [V3178](https://pvs-studio.ru/ru/docs/warnings/v3178/)\. Calling method or accessing property of potentially disposed object may result in exception\.
* [V3179](https://pvs-studio.ru/ru/docs/warnings/v3179/)\. Calling element access method for potentially empty collection may result in exception\.
* [V3180](https://pvs-studio.ru/ru/docs/warnings/v3180/)\. The 'HasFlag' method always returns 'true' because the value '0' is passed as its argument\.
* [V3181](https://pvs-studio.ru/ru/docs/warnings/v3181/)\. The result of '&' operator is '0' because one of the operands is '0'\.
* [V3182](https://pvs-studio.ru/ru/docs/warnings/v3182/)\. The result of '&' operator is always '0'\.

**Интерактив**

Сделали опрос "Кто ты в мире C\#"\. Пройти его можно [здесь](https://pvs-studio.ru/ru/blog/quest/who_you_are_in_csharp/)\.

![1000_Release_7_21_ru/image3.png](https://import.viva64.com/docx/blog/1000_Release_7_21_ru/image3.png)

Кстати, напишите, если сможете пройти тест не на результат "Ты сборщик мусора"\. Или мне так не везёт, или наша C\# команда всех затроллить решила\.\.\. :\)

Если вы пропустили другие интерактивы, вот они:

* [опрос](https://pvs-studio.ru/ru/blog/quest/who_you_are_in_cpp/) "Кто ты в мире C\+\+";
* [игра](https://quiz.pvs-studio.com/ru/csharp/) "Поиск ошибок в коде на C\#";
* [игра](https://quiz.pvs-studio.com/ru/cpp/) "Поиск ошибок в коде на C\+\+"\. 

**Статьи**

Для тех, кто пишет на C\+\+:

* Топ\-10 докладов на С\+\+ конференциях 2019\-2022 года \([ссылка](https://pvs-studio.ru/ru/blog/posts/cpp/0999/)\);
* Есть ли жизнь без RTTI: пишем свой dynamic\_cast \([ссылка](https://pvs-studio.ru/ru/blog/posts/cpp/0998/)\);
* Боремся с 16\-летним легаси\-кодом, или исправляем C и C\+\+ front\-end в PVS\-Studio \([ссылка](https://pvs-studio.ru/ru/blog/posts/cpp/0992/)\);
* Интервью с Джейсоном Тернером, одним из ведущих подкаста "CppCast": история и причины закрытия проекта \([ссылка](https://pvs-studio.ru/ru/blog/posts/cpp/0993/)\)\.

Для тех, кто пишет на C\#:

* Сортировки в C\#: OrderBy\.OrderBy или OrderBy\.ThenBy? Разбираемся, что эффективнее и почему \([ссылка](https://pvs-studio.ru/ru/blog/posts/csharp/0991/)\);
* Особенности реализации List в C\# \([ссылка](https://pvs-studio.ru/ru/blog/posts/csharp/0995/)\);
* Чем опасны уязвимые зависимости в проекте и как с этим помогает SCA? \([ссылка](https://pvs-studio.ru/ru/blog/posts/csharp/0987/)\);
* Планируете взяться за \.NET MAUI? Будьте готовы к приключениям с NullReferenceException \([ссылка](https://pvs-studio.ru/ru/blog/posts/csharp/0996/)\)\.

Поиск ошибок в коде проектов:

* игровой движок Stride \(C\#\): [ссылка](https://pvs-studio.ru/ru/blog/posts/csharp/0994/);
* фреймворк машинного обучения ML\.NET \(C\#\): [ссылка](https://pvs-studio.ru/ru/blog/posts/csharp/0988/);
* сборочная система MSBuild \(C\#\): [ссылка](https://pvs-studio.ru/ru/blog/posts/csharp/0986/);
* фреймворк и CMS Orchard Core \(C\#\): [ссылка](https://pvs-studio.ru/ru/blog/posts/csharp/0982/);
* JavsScript\-движок Rhino \(Java\): [ссылка](https://pvs-studio.ru/ru/blog/posts/java/0990/)\.

**Доклады**

В сеть выложили записи докладов с конференции DotNext 2022 Spring\. Полный список записей доступен [здесь](https://www.youtube.com/c/DotNextConf/videos)\.

![1000_Release_7_21_ru/image4.png](https://import.viva64.com/docx/blog/1000_Release_7_21_ru/image4.png)

От нашей команды на конференции было 2 доклада, и оба посвящены вопросам безопасности:

* Никита Липилин: SAST и SCA: поиск дефектов безопасности в коде проекта и его зависимостях\. [Ссылка](https://www.youtube.com/watch?v=1aO4zeUUhlA&t=12s&ab_channel=DotNext)\.
* Сергей Васильев: Обработка XML\-файлов как причина появления уязвимостей\. [Ссылка](https://www.youtube.com/watch?v=7L21g7eedtA&t=111s&ab_channel=DotNext)\.

Ещё одна конференция, доклады с которой стали доступны – Heisenbug 2022 Spring\. Полный список записей докладов – [здесь](https://www.youtube.com/c/Heisenbugconf/videos)\.

![1000_Release_7_21_ru/image5.png](https://import.viva64.com/docx/blog/1000_Release_7_21_ru/image5.png)

Доклады от нашей команды:

* Сергей Васильев: Как устроено тестирование средства статического тестирования\. [Ссылка](https://youtu.be/ihVCwkdEqRA)\.
* Сергей Васильев: Правильно ли вы парсите XML? Разбираемся с уязвимостями\. [Ссылка](https://youtu.be/1OuJkOH8aP4)\.