Этот момент настал — теперь наш плагин доступен для загрузки из маркетплейса OpenIDE. Более подробно рассказываем в этой статье.

О действующих лицах

Если вы ничего не знаете про OpenIDE и/или PVS-Studio — в этом разделе мы вас с ними познакомим.

OpenIDE

"OpenIDE — бесплатная лицензионно чистая IDE на базе IntelliJ IDEA Community Edition с открытым исходным кодом". Это информация с их официального сайта.

Может возникнуть резонный вопрос: "А зачем нужна IDE на основе IDEA CE, если есть сама IDEA CE?" Тут можно выделить следующие причины:

  • OpenIDE не связана с теми компонентами IntelliJ IDEA Community Edition, которых может коснуться блокировка со стороны JetBrains в отношении РФ.

  • Возможность использовать в госсекторе. Здесь процитирую самих разработчиков: "С OpenIDE ваша организация сможет полностью соответствовать требованиям по обработке данных и использованию ПО в госсекторе".

  • JetBrains (создатели IntelliJ IDEA) приостановила продажу собственной продукции на территории РФ. Купить определённые плагины или прокачаться до Ultimate версии нельзя.

  • Дополнительно с IDE поставляется целая инфраструктура, представленная инструментами для работы со Spring и Docker, а также собственным маркетплейсом плагинов.

Так что, определённым группам разработчиков или компаниям OpenIDE может быть полезна.

Тем более, IntelliJ IDEA является мейнстримом в мире Java/Kotlin разработки. И в случае блокировок переходить на то, что сделано на её основе, удобнее, чем привыкать к чему-то другому. Намного меньше проблем и потраченного времени.

Создание собственной инфраструктуры, адаптация продукта под требования для включения в реестр российского ПО и другие связанные задачи требуют значительных временных и профессиональных ресурсов. Здесь особенно важно привлечение специалистов, обладающих необходимой экспертизой в области разработки. Поэтому встаёт вопрос: кто этим занимается?

С OpenIDE связана целая группа компаний:

  • "Группа Астра": разработчики системного и прикладного ПО. Та самая "Astra Linux" — это именно их продукт;

  • "Хоулмонт": разработчики корпоративного ПО для среднего и крупного сегментов бизнеса. Их вы можете знать по Amplicode — плагину для работы со Spring-проектами;

  • "Axiom JDK": вендоры российской среды разработки и исполнения Java. С ними, к слову, у нас был совместный вебинар на тему "Безопасность приложений: инструменты и практики для Java-разработчиков".

PVS-Studio

PVS-Studio — статический анализатор, работающий с языками программирования C/C++, C#, Java. Иными словами, программное обеспечение, которое ищет ошибки в исходном коде программ.

С инструментом можно подробно ознакомиться по информации из блога или документации. Здесь для краткости перечислю самые основные моменты:

  • Помимо поиска обычных ошибок, анализатор специализируется на выявлении тех, что связанны с безопасностью разрабатываемого ПО: потенциальных уязвимостей, возможных дефектов безопасности и т.д. Поэтому PVS-Studio является SAST-решением.

  • Мы разрабатываем анализатор с учётом требований ГОСТ 71207-2024 "Статический анализ программного обеспечения. Общие требования". Более подробная информация представлена здесь.

  • Наш инструмент включён в Реестр российского ПО (запись N 9837 от 18.03.2021).

  • Статический анализатор PVS-Studio успешно применяется испытательными лабораториями, аккредитованными в системах сертификации средств защиты информации ФСТЭК России в рамках работ по сертификационным испытаниям программных продуктов.

В общем, приятно познакомиться!

Обзор плагина

Java-анализатор представляет собой:

  1. Ядро. Программа, которая выполняет анализ;

  2. Плагин для Gradle/Maven/IDEA. Средство запуска анализатора, предоставляющее ядру всю необходимую информацию о проекте.

Как всё это установить, как выглядит плагин и как им пользоваться — обо всём этом с иллюстрациями расскажем далее.

Как установить

Ядро Java-анализатора с плагином устанавливаются через маркетплейс OpenIDE. Чтобы это сделать, следуйте пошаговой инструкции:

Запускаем OpenIDE. Далее переходим во вкладку Plugins.

В открывшемся окне нужно выбрать вкладку Marketplace и в строке поиска набрать "PVS-Studio". В списке должен появиться наш плагин. Убеждаемся, что это он, и нажимаем кнопку Install.

После загрузки плагина будет предложено перезапустить IDE. Соглашаемся и перезагружаем.

Готово! Плагин установлен. PVS-Studio готов к использованию в OpenIDE.

Как выглядит плагин PVS-Studio

А сейчас предлагаем посмотреть, что из себя представляет наш анализатор. Проверим реальный Open Source проект и посмотрим на возможности плагина.

Предварительная настройка

Мы выбрали проект zaproxy. На момент анализа последний коммит — 98e74f. Клонируем проект из репозитория, открываем и можно анализировать. Для того, чтобы анализ прошёл корректно, проект нужно собрать. Выполняем. Благо, здесь это выполняется просто: ./gradlew assemble.

Теперь можно настраивать анализатор. Для этого перейдём в его настройки в OpenIDE: Settings > PVS-Studio. Выглядят настройки анализатора вот так:

В первую очередь, чтобы анализ проекта произошёл корректно, необходимо выставить ту же версию Java, на которой проект собирался. Делается это в блоке Environment на странице Settings:

Поскольку я собирал на Java 23, анализировать тоже буду на 23-ей версии.

Далее переходим к следующей настройке — включение дополнительных диагностик, ориентированных на безопасность. Они включаются во вкладке Warnings. Выбираем OWASP, выставляем значение в Show All.

В целом первичная настройка готова. Можно анализировать.

Анализ

Запустить анализ проекта можно следующим образом: переходим во вкладку Tools > PVS-Studio. Выбираем Check Project. Нажимаем, и анализ проекта выполняется.

Запускается процесс анализа. Теперь остаётся только ждать результатов...

Вместе с построением модели анализ занял у меня пару минут, и по его прошествии открылось специальное окно для просмотра отчёта.

Это и есть срабатывания анализатора.

Работа с результатами анализа

Теперь давайте взглянем на результат. Мне сразу бросились в глаза срабатывания диагностики V6071. Фрагмент из документации к ней:

Анализатор обнаружил в файле copyleft лицензию, которая обязывает открыть остальной исходный код. Это может быть неприемлемо для многих коммерческих проектов.

Если вы разрабатываете открытый проект, то можно просто игнорировать это предупреждение и отключить его.

Поскольку у нас Open Source проект, предупреждения действительно не по делу. Отличная возможность продемонстрировать то, как можно почистить сетку срабатываний от ненужных.

Кликаем на него, выбираем Hide All V6071 Errors. Готово, теперь диагностические правила V6071 не будут отображаться в окне плагина.

Далее я хотел бы исключить из просмотра срабатывания третьего, LOW-уровня (наименее достоверные). Для этого можно просто кликнуть на соответствующую кнопку в верхней панели плагина:

Итак, давайте теперь посмотрим на пару сообщений PVS-Studio.

private final Long messageSize;
.... 
private Long extractMessageSize(HistoryReference historyReference, 
                                boolean required) {
    ....

    return (long)
            (historyReference.getRequestHeaderLength()
                    + historyReference.getRequestBodyLength()
                    + historyReference.getResponseHeaderLength()
                    + historyReference.getResponseBodyLength());
}

V5308 Possible overflow. The expression will be evaluated before casting. Consider casting one of the operands instead. DefaultHistoryReferencesTableEntry.java 154

Здесь высчитывается значение messageSize. Подразумевается, что оно может выходить за размеры int, раз оно объявлено как Long (другие аналогичные поля представлены Integer-типами). Но, скорее всего из-за опечатки, происходит немного по-другому. В скобках считается выражение, а потом результат приводится к long-типу. В случае, если результат сложения выходит за пределы значений int, к типу long будет приведено переполненное значение int. Чтобы не допустить этого, нужно привести к типу long первое из слагаемых:

return ((long) historyReference.getRequestHeaderLength()
                    + historyReference.getRequestBodyLength()
                    + historyReference.getResponseHeaderLength()
                    + historyReference.getResponseBodyLength());
Маленькое напоминание о сложении целых чисел

int + int = int

long + int = long

Кстати, эта ошибка с точки зрения ГОСТ 71207-2024 относится к классу критических дефектов: "Ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел". Подробную информацию про выборку критических ошибок в PVS-Studio смотрите в статье "Ошибки Java по ГОСТу: обзор и примеры".

Для разнообразия второе срабатывание будет ложным, и мы посмотрим, как с ним работать.

/** Calculates RC4 */
static byte[] RC4(final byte[] value, final byte[] key)
  throws AuthenticationException {
  try {
    final Cipher rc4 = Cipher.getInstance("RC4");     // <=
    rc4.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "RC4"));
    return rc4.doFinal(value);
  } catch (final Exception e) {
    throw new AuthenticationException(e.getMessage(), e);
  }
}

V5315 Use of the 'RC4' cryptographic algorithm is not recommended. Such code may cause the exposure of sensitive data. ZapNTLMEngineImpl.java 595

Эта диагностика ищет использование устаревших криптографических алгоритмов шифрования. Её срабатывания актуальны в случае, когда эти алгоритмы используются в контексте, требующем повышенного внимания к безопасности. К примеру, когда речь идёт о шифровании паролей пользователей.

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

Чтобы ложное срабатывание не отображалось в отчёте, нужно выделить нужное предупреждение или группу предупреждений, кликнуть по ним правой кнопкой мыши и выбрать пункт Mark Selected Messages As False Alarm.

Это добавит комментарий вида //-Vxxxxк соответствующему фрагменту кода. Он сообщит анализатору, что срабатывание ложное, и в отчёте оно отображаться не будет.

Если же не хочется модифицировать файл с исходным кодом, есть возможность использовать механизм подавления предупреждений. Необходимо кликнуть по нужному сообщению правой кнопкой мыши и выбрать пункт Add Selected Messages To Suppression File:

Это уберёт выбранное сообщение из отчёта и добавит его в специальный файл suppress_base.json. Он лежит в директории .PVS-Studio, что находится в корневой папке проекта.

Какой способ вы бы ни выбрали, при последующих итерациях анализа срабатывания, выделенные как ложные, отображаться в отчёте не будут.

В целом, это самая основа работы с анализатором посредствам нашего плагина для OpenIDE. Более подробно со всем функционалом можно познакомиться в документации.

Итог

Использование продукции JetBrains сейчас может быть затруднительным:

  • санкции с их стороны;

  • необходимость использовать российское ПО в госсекторе.

Поэтому потребность в OpenIDE может возрасти. И чтобы Java-разработчикам было удобно пользоваться нашим плагином, мы добавили его в маркетплейс OpenIDE. Ура-ура!

Будет интересно узнать, пользуетесь ли вы OpenIDE. Если вдруг у вас есть опыт работы в ней, обязательно делитесь своим мнением в комментариях.

P.S.

Возможно, в будущем мы выпустим статью-проверку zaproxy. Обязательно следите за нашим блогом!

А на этом всё — будем прощаться. Попробовать PVS-Studio вы можете по этой ссылке. До скорой встречи!

Комментарии (2)


  1. HDDimon
    31.07.2025 13:10

    Есть ли у вас какие-то разграничения на наборы проверок? То есть в базовой версии доступна часть, но чтобы пользоваться полной версией нужно ее купить?


    1. vlade1k Автор
      31.07.2025 13:10

      Анализатор поставляется сразу со всеми диагностиками. В независимости от типа лицензии, доступны все типы диагностик.
      Узнать, какие лицензии доступны для приобритения можно здесь: https://pvs-studio.ru/ru/order/license/