Лето - не только сезон отпусков, но и время плодотворной работы. Солнечные дни так сильно заряжают энергией, что хватает сил и на поздние прогулки, и объёмные коммиты кода. Второй летний релиз PVS-Studio 7.04 получился достаточно большой, поэтому предлагаем вашему вниманию пресс-релиз, в котором обо всём и расскажем.
PVS-Studio - это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках С, C++, C# и Java. Работает в среде Windows, Linux и macOS.
Возможности анализатора хорошо демонстрирует обширная коллекция ошибок в коде, найденных нами в процессе проверки различных отрытых проектов.
Предлагаем вашему вниманию обзор новых возможностей, вошедших в релиз PVS-Studio 7.04.
Разработчики откуда только не берут код, работая над поставленной задачей. Популярным источником Copy-Paste-кода является сайт Stack Overflow и ему подобные. Но возможны и ситуации, когда программист берёт код из Open Source проекта и не проверяет требования лицензии. Таким образом, в проект с закрытым исходным кодом может случайно попасть несколько файлов из Open Source проекта с Copyleft-лицензией, т.е. обязывающей делать весь код проекта публичным. В компаниях с большим количеством сотрудников за этим сложно уследить, а риски и проблемы могут быть серьёзными из-за таких действий. Так, в PVS-Studio для всех поддерживаемых языков (C, C++, C#, Java) появилась диагностика, которая поможет найти такие файлы.
Номера диагностик для разных языков:
Давайте остановимся на этих диагностиках чуть подробнее и разберём, для чего они сделаны. Пример комментария, на который анализатор выдаст предупреждение:
/* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Если в закрытый проект добавить файл с такой лицензией (GPL3 в данном случае), то остальной исходный код необходимо будет открыть, из-за особенностей данной лицензии.
Такой тип copyleft лицензий называют "вирусными" лицензиями, из-за их свойства распространяться на остальные файлы проекта. Проблема в том, что использование хотя бы одного файла с подобной лицензией в закрытом проекте автоматически делает весь исходный код открытым и обязывает распространять его вместе с бинарными файлами.
Диагностика занимается поиском следующих "вирусных" лицензий:
Есть следующие варианты, как вы можете поступить, обнаружив в закрытым проекте использование файлов с copyleft лицензией:
Мы понимаем, что данная диагностика неуместна для открытых проектов. Команда PVS-Studio способствует развитию открытых проектов, помогает исправлять в них ошибки и предоставляет бесплатные варианты лицензий. Однако, наш продукт является B2B решением и поэтому данная диагностика по умолчанию включена.
Если же ваш код распространяется под одной из указанных выше copyleft лицензий, то вы можете отключить данную диагностику следующими способами (для С\С++ это V1042):
Для C# соответственно имеется в виду V3144, а для Java - V6071.
Если вам известны ещё типы "вирусных" лицензий, которые в данный момент не выявляет инструмент, то вы можете сообщить нам о них через форму обратной связи. И мы добавим их выявление в следующем релизе.
Отдельно хочется отметить диагностику с номером V1040. Ещё в статусе беты она уже нашла интересную ошибку в библиотеке всем известного проекта CMake:
V1040 Possible typo in the spelling of a pre-defined macro name. The '__MINGW32_' macro is similar to '__MINGW32__'. winapi.h 4112
/* from winternl.h */
#if !defined(__UNICODE_STRING_DEFINED) && defined(__MINGW32_)
#define __UNICODE_STRING_DEFINED
#endif
Здесь допустили опечатку в имени __MINGW32_. В конце не хватает одного символа подчёркивания. Если сделать поиск по коду с этим именем, то можно убедиться, что в проекте действительно используют версию именно с двумя подчёркиваниями с двух сторон:
Посмотреть все найденные ошибки в проекте CMake можно в статье "CMake: тот случай, когда проекту непростительно качество его кода".
Также в C# анализаторе добавлено вычисление возвращаемых\записываемых значений из get и set методов доступа свойств и async методов.
Сейчас мы работаем над улучшением отслеживания значений полей и свойств у объектов при передаче их в методы, а также отслеживанием содержимого кортежей. Эти улучшения будут доступны в следующем релизе анализатора.
Почти 2 года прошло с момента последнего релиза LTS-версии SonarQube 6.7. Новую версию с особым рвением ждали, начиная с SQ 7.x, и, когда состоялся релиз LTS, пользователи начали активно переходить на неё, что повлекло разные проблемы. Вскоре вышел SQ 7.9.1 LTS с небольшими исправлениями, и разработчики сторонних плагинов тоже подготовили патчи.
К счастью, в плагине PVS-Studio возникла всего одна небольшая проблема, связанная с переходом на Java 11, которую мы оперативно исправили, и наши клиенты сразу перешли на работоспособную версию.
Также мы сохранили совместимость со старыми версиями SonarQube, и список поддерживаемых версий сейчас выглядит так: SonarQube 6.7 LTS и выше.
Плагин PVS-Studio выполняет только конвертацию результатов анализа в формат базы данных SonarQube. Другими словами, просто загружает результаты анализа PVS-Studuio в SQ. Но для полноценной работы утилиты SonarScanner должны быть установлены плагины для языков программирования. Мы не стали разрабатывать то, что уже существует, поэтому просто добавляем поддержку уже существующих популярных плагинов. В этой версии мы добавили совместимость с языковыми плагинами Sonar C Community и SonarCFamily.
Весь список поддерживаемых языковых плагинов выглядит так:
Для загрузки результатов анализа PVS-Studio достаточно установить хотя бы один плагин из этого списка. Большинству пользователей достаточно установить только Sonar C++ Community, SonarC# или SonarJava. Остальные плагины могут понадобиться для более специфичных проектов.
При выборе плагинов необходимо учесть тот факт, что Community-плагины не совместимы с SonarCFamily. Но если вы используете только SonarQube Community Edition, то такой проблемы не возникнет.
Ранее настраивать анализатор можно было только через конфигурационный файл sonar-project.properties. К этому способу никаких претензий нет. Он очень удобный и используется в 99% случаев, но мы дополнительно сделали страницу настроек в Administration > Configuration > PVS-Studio на сервере SonarQube, т.к. этим тоже удобно пользоваться в некоторых сценариях.
Страница настроек выглядит так:
При задании настроек двумя способами, приоритетными являются те, что указаны в файле sonar-project.properties.
Релизы новых версий IntelliJ IDEA и PVS-Studio отличаются по датам, и недавно возникла ситуация, когда вышла IntelliJ IDEA 192.*, а плагин PVS-Studio на ней не устанавливался. В этом релизе мы добавили поддержку последней версии IntelliJ IDEA, а также сделали доработки, чтобы избежать подобных проблем в будущем.
PVS-Studio Plugin
PVS-Studio Plugin предназначен для публикации результатов работы анализатора PVS-Studio в системе непрерывной интеграции Jenkins в формате HTML. Ранее этот плагин был доступен только пользователям Windows, т.к. вызывал конвертер отчёта автоматически и делал это только для Windows. В PVS-Studio 7.04 плагин поддерживает только HTML-отчёты, которые необходимо сгенерировать отдельным шагом, но это позволило сделать плагин кросс-платформенным.
Warnings NG Plugin
Для Jenkins существует полезный плагин Warnings Next Generation Plugin для просмотра результатов анализа от разных инструментов. Недавно мы добавили поддержку PVS-Studio в нём. Возможность загружать результаты анализа PVS-Studio с помощью этого плагина стала доступна в версии 6.0.0, релиз которой случайно совпал с релизом PVS-Studio 7.04:
PVS-Studio_Cmd
В PVS-Studio_Cmd.exe был добавлен специальный режим работы - credentials. Этот режим позволит создавать файл настроек и вводить лицензионную информацию без использования GUI интерфейса (например, плагина для Visual Studio или утилиты C and C++ Compiler Monitoring UI). Особенно актуален этот режим при использовании на сборочном сервере (где может не быть описанных GUI утилит), в контейнерах, при интеграции с облачными решениями.
Анализ Unreal Engine проектов
В плагине PVS-Studio для Visual Studio была добавлена опция AutoloadUnrealEngineLog, включение которой позволяет автоматически загружать отчёт анализатора в окно вывода PVS-Studio после прохождения анализа. Без этой опции загрузку лога необходимо делать вручную через меню плагина.
Также в разделе документации "Проверка Unreal Engine проектов" были описаны изменения стандартных сборочных скриптов, которые позволят проводить сборку и анализ в одно действие. Без модификации скриптов (при добавлении флага -StaticAnalyzer=PVSStudio к аргументам запуска) проводится только анализ проекта, без выполнения его сборки.
CLMonitor
Для утилиты CLMonitor была добавлена возможность отслеживания запусков компилятора для конкретного процесса. Это позволит отслеживать запуски компиляторов, относящихся только к конкретному проекту, даже при параллельной сборке нескольких проектов. Для работы в таком режиме используются флаги ‑‑parentProcessID %PID% (CLMonitor отслеживает процессы, дочерние относительно указанного) и ‑‑attach (CLMonitor отслеживает процессы, дочерние относительно текущей консоли).
pvs-studio-analyzer
В утилиту pvs-studio-analyzer, которая предназначена для проверки проектов в Linux и macOS, добавлен флаг ‑‑ignore-ccache:
pvs-studio-analyzer analyze ... --ignore-ccache ...
Если в сборке проекта используется утилита ccache, то PVS-Studio работает в режиме инкрементального анализа. Чтобы проверить проект полностью, не сбрасывая кэш утилиты ccache, используйте этот флаг.
Чтобы быть в курсе наших новых публикаций, приглашаем подписаться на нас:
PVS-Studio: