В самом начале пути у многих новичков программистов есть много пробелов, даже в базовых вещах. Для выявления таких проблем существует бесплатное решение - SonarQube, которое позволяет довольно быстро обнаруживать множество ошибок и уязвимостей. Здесь мы разберемся, как воспользоваться этим инструментом.
Какие технологии помогают анализировать код на ошибки и уязвимости?
Существует несколько решений, которые позволяют проводить различные виды анализа, но чаще всего у них есть много общего. Популярные решения:
SonarQube
FindBugs
PMD
SpotBugs
Checkstyle
Snyk
JArchitect
Graudit
В данной статье мы рассмотрим SonarQube и PMD.
SonarQube настройка, установка, запуск.
SonarQube - довольно популярное решение, хотя, по моему мнению, изначальные правила проверок лучше немного перенастроить. SonarQube предоставляет бесплатную версию, которая может быть запущена из-под Docker в одну команду. Все, что вам потребуется, это сервер с 2 ГБ оперативной памяти (но чем больше, тем лучше). Как настраивать и арендовать сервер я писал вот тут.
Запускаем Sonar используя Docker.
Запускаем докер одной командой:
docker run -d --name sonarqube -p 9002:9000 -p 9092:9092 sonarqube
Первый логин проходит под admin/admin
После запуска следует подождать примерно пять минут и затем открыть ваш сервер. Первый вход потребует использования имени и пароля admin/admin, после чего система попросит изменить пароль. На данном этапе мы пропустим этот шаг.
Процесс создания проекта и генерации токена.
Существуют разные способы интеграции с SonarQube. Самый простой — интегрировать зависимость в Maven/Gradle вашего проекта и затем выполнить одну команду в командной консоли. Ниже я постараюсь упростить процесс генерации токена и проекта до шести команд:
6 шагов для генерации имени проекта, ключа и токена. Все они нужны для отправки вашего кода сонару
После выполнения всех 6 шагов у нас есть:
Имя проекта pikabu
Имя ключа pikabu
имя токена
Чтобы Sonar проводил более подробную аналитику, рекомендуется установить плагины. Для этого перейдите в раздел Administration => Marketplace и выберите плагины по вашему желанию:
Плагины имеют много общих правил и настроить профиль без пересечений это головная боль.
Настраиваем Maven и добавляем Sonar плагин.
Для настройки мавен проекта достаточно добавить плагин в pom.xml:
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.9.1.2184</version>
</plugin>
Теперь мы готовы к анализу нашего кода.
Напишем код с наиболее популярными ошибками в Java.
Я приведу далеко не все классические ошибки, но для оценки базовой функциональности этого будет достаточно:
Несколько популярных ошибок среди триллиона возможных.
Все настроено. Погнали.
Если в файле pom.xml добавлен Sonar плагин, и имя проекта, ключ и токен готовы, после сборки проекта можно запустить команду для передачи результатов в SonarQube:
mvn sonar:sonar -Dsonar.projectKey=pikabu -Dsonar.projectName=pikabu -Dsonar.host.url=http://IP_СЕРВЕРА:9002 -Dsonar.login=sqp_4d542b25...
Анализируем результаты
После запуска заходим в проект (в моем случае pikabu) и нажимаем Overall Code
Я подключил слишком много правил поэтому среди найденных проблем есть дубликаты.
Результаты
Обнаружено 6 багов.
Покрытие составляет 0% (для более точного анализа покрытия, рекомендуется интегрировать Jococo плагин).
Выявлено 49 вонючих строк кода.
Поскольку я включил более 1000 правил (по умолчанию их всего 400), некоторые проблемы среди 49 являются просто дубликатами. Давайте рассмотрим самые важные, а именно баги:
Часть проблем была найдена, но не все.
В результате часть багов была отловлена, но некоторые например незакрытый стрим или итерация через итератор - нет.
Также можно выбрать файл и посмотреть всю аналитку:
Слишком много правил я выбрал, сонар не анализирует а уже душнит.
Какие выводы можно сделать?
С учетом того что сонар ставится без оплаты и лишь имеет ряд ограничений - утилита хороша. Среди вещей которые я бы отметил:
Сонар однозначно отлавливает много багов но не все.
Во много качество сонара определяется настроеными правилами (Quality profiles) которые затем и используются во время анализа. Подружить их все - довольно непросто.
Слишком большое количество правил руинит весь смысл анализа.
Двигаемся дальше. PMD анализатор кода.
Sonar не является чем-то уникальным. Давайте рассмотрим другое бесплатное решение - PMD. Кстати, правила PMD могут быть скачены и запущены в Sonar, но с первой попытки у меня это не получилось из-за проблемы с соответствием версий PMD/SONAR/JAVA.
Ставим PMD
Чтобы поставить PMD достаточно скачать с их сайта pmd-dist-7.0.0-rc4-bin.zip и распаковать. Затем добавить в PATH bin папку и запусить команду:
>pmd check -d C:\cleancode -R rulesets/java/quickstart.xml -f html -r report.html
В команде C:\cleancode является папкой проекта где лежит ваш Java код. Результатом работы будет созданный report.html. Вот результаты его работы:
И так результаты PMD мне зашли. Он нашел почти все проблемы, часть которых Sonar пропустил (точнее тысяча правил которые я подключил из стандартных наборов).
Всем кому интересна разработка на Java и смежный мир технологий добро пожаловать в мой телеграм канал. Всем спасибоо за внимание.