>
>
PVS-Studio 7.08

Андрей Карпов
Статей: 673

Сергей Васильев
Статей: 96

PVS-Studio 7.08

PVS-Studio - это инструмент для поиска ошибок в коде программ на языке C, C++, C#, Java. В релиз PVS-Studio 7.08 вошло много нового и интересного: C# анализатор, в дополнении к работе на ОС семейства Windows, теперь работает также на Linux и macOS; появился вывод результатов анализа в формате TeamCity; поддержана система Perforce в утилите автоматического оповещения разработчиков; появился плагин для среды разработки JetBrains Rider; в Java анализаторе PVS-Studio добавлена возможность поиска проблем совместимости Java SE API. Рассмотрим в статье эти нововведения более подробно.

C# анализатор для Linux и macOS

В конце апреля мы запустили бета-тестирование C# анализатора для Linux и macOS. И достаточно успешно его провели – собрали фидбек, внесли ряд улучшений и исправлений.

И вот теперь, наконец, мы делаем релиз, в который вошёл C# анализатор для Linux и macOS! Таким образом, теперь C# анализатор, равно как C, C++, Java анализаторы, доступен под всеми поддерживаемыми PVS-Studio платформами - Windows, Linux и macOS.

Command-line утилита для анализа C# проектов под Linux \ macOS носит название pvs-studio-dotnet. Особенности установки и использования анализатора описаны в соответствующих разделах документации:

Плагин PVS-Studio для IDE JetBrains Rider

Параллельно с разработкой и тестированием C# анализатора под Linux и macOS мы также вели разработку плагина PVS-Studio для JetBrains Rider. И не менее радостно сообщить, что он также вошёл в релиз и доступен под всеми поддерживаемыми платформами: Windows, Linux, macOS.

Более подробно установка и использование плагина описывается в разделе документации "Работа PVS-Studio в JetBrains Rider".

Новый режим анализа pull requests \ merge requests \ commits

В Windows версии анализатора, в command line утилите PVS-Studio_Cmd, добавлен новый режим работы проверки заданного списка файлов, полезный для настройки автоматической проверки pull \ merge request'ов и коммитов.

Вообще-то говоря, в предыдущих версиях анализатора уже был аналогичный режим, однако его использование было не самым удобным, особенно для C++ проектов.

Во-первых, в случае анализа как C++, так и C# проектов, для указания списка файлов на анализ (через флаг ‑‑sourceFiles) требовался XML файл. Т.е. его нужно было специальным образом формировать из списка файлов в PR, MR, commit'е, а это – какой-никакой дополнительный шаг.

Во-вторых, если было нужно анализировать исходные файлы на основе .h файлов (поменяли .h файл, нужно проанализировать все исходные файлы, куда он включался явно или косвенно), требовалось наличие артефактов сборочной системы (tlog-файлов), которые предварительно нужно было получить, проводя сборку проверяемого проекта.

Теперь использовать этот режим стало намного проще и удобнее – не нужны ни tlog файлы, ни специальные XML файлы. Достаточно просто использовать всё тот же флаг ‑‑sourceFiles, в который нужно передать простой текстовый файл со списком файлов на анализ. И всё, никаких tlog файлов! Для решения задачи хранения зависимостей анализатор теперь создаёт специальный кэш зависимостей между заголовочными и исходными файлами, вместо использования tlog файлов, что намного упрощает данный режим использования.

Более подробно данный режим описан в подразделе "Задание отдельных файлов для проверки" раздела документации "Проверка проектов Visual Studio / MSBuild / .NET Core из командной строки с помощью PVS-Studio".

Прочие улучшения и нововведения

  • В утилитах PVS-Studio_Cmd и pvs-studio-dotnet появилась возможность передавать .pvsconfig-файлы через аргументы командной строки (‑‑rulesConfig (-C)).
  • В plog-converter (утилита конвертации логов на Linux, macOS ) был добавлен формат вывода для TeamCity. В прошлом релизе этот формат вывода был добавлен в PlogConverter для Windows.
  • Нами было проаннотировано множество методов из библиотек Unity, что позволит C# анализатору иметь больше информации об этих методах, и как следствие – проводить более точный анализ Unity проектов.
  • В утилиту автоматического оповещения разработчиков blame-notifier добавлена поддержка новой системы контроля версий - Perforce. Таким образом, теперь blame-notifier умеет работать со следующими VCS: Git, SVN, Mercurial, Perforce. Кроме того, для Perforce добавлен режим автоматического получения списка получателей отчётов.
  • В Unreal Engine 4.25 появилась возможность использования различных групп диагностических правил PVS-Studio (ранее была доступна только группа "General Analysis"). О том, как включать различные группы диагностик, написано в соответствующем разделе документации.

Новые диагностические правила

Добавлено девять диагностических правил. Среди них, диагностика V6078 явно заслуживает больше внимания, и мы рассмотрим её отдельно в следующем разделе.

C, C++:

  • V824. It is recommended to use the 'make_unique/make_shared' function to create smart pointers.
  • V825. Expression is equivalent to moving one unique pointer to another. Consider using 'std::move' instead.
  • V1056. The predefined identifier '__func__' always contains the string 'operator()' inside function body of the overloaded 'operator()'.
  • V1057. Pseudo random sequence is the same at every program run. Consider assigning the seed to a value not known at compile-time.
  • V1058. Nonsensical comparison of two different functions' addresses.

Java:

  • V6078. Potential Java SE API compatibility issue.
  • V6079. Value of variable is checked after use. Potential logical error is present. Check lines: N1, N2.
  • V6080. Consider checking for misprints. It's possible that an assigned variable should be checked in the next condition.
  • V6081. Annotation that does not have 'RUNTIME' retention policy will not be accessible through Reflection API.

V6078 - Potential Java SE API compatibility issue

Доклад Dalia Abo Sheasha "Migrating beyond Java 8", услышанный нами на осенней конференции Joker 2019, вдохновил нас на реализацию нового диагностического правила, которое позволяет выявлять несовместимости в Java SE API между разными версиями Java.

На текущей момент уже вышла Java SE 14. Несмотря на это, многие компании продолжают использовать прежние версии Java (Java SE 6, 7, 8, ...). В связи с тем, что время идет, и Java все время обновляется, проблема совместимости различных версий Java SE API с каждым годом становится все актуальней.

Когда выходят новые версии Java SE, то они, как правило, обратно совместимы с более ранними версиями, то есть, например, приложение, разработанное на основе Java SE 8, должно без проблем запуститься на 11 версии Java. Однако на практике может возникать некоторая несовместимость в ряде классов и методов. Эта несовместимость заключаются в том, что некоторые API претерпевают изменения: удаляются, меняются в поведении, помечаются как устаревшие и многое другое.

Эта проблема только обострится, когда вы начнете задумываться о миграции своего проекта на более свежую Java SE. Или же когда в техническую поддержку вашего приложения будут все чаще и чаще приходить письма о том, что приложение некорректно себя ведет или вообще не может запуститься.

Чтобы помочь с решением этой проблемы, мы добавили в анализатор "большое" диагностическое правило V6078. Более подробно история разработки диагностики представлена в статье "Анализатор PVS-Studio: выявления потенциальных проблем совместимости Java SE API".

P.S. Compiler Explorer (godbolt.org)

Почти одновременно с выходом релиза мы подружили PVS-Studio с Compiler Explorer. Конечно, к релизу это не имеет прямого отношения, но хочется ещё раз рассказать тем, кто пропустил эту новость.

Благодаря проекту Compiler Explorer вы можете быстро подготовить синтетические примеры C и C++ кода, и посмотреть, как на них поведёт себя анализатор PVS-Studio.

Посмотреть и попробовать: Online-примеры (C, C++).

Дополнительные ссылки