PVS-Studio: поиск ошибок в коде
1.85K subscribers
1.66K photos
89 videos
2 files
1.65K links
Статический анализатор на страже качества, защищённости (SAST) и безопасности кода.

Наш стек: C, C++, C#, Java, JS, TS, Go

Сайт: https://pvs-studio.ru/

E-Mail: support@viva64.com
Телефон: +7(903)844-02-22

Для бизнеса: https://xn--r1a.website/pvsstudio_business
Download Telegram
Спешим поделиться интересной ошибкой, которую нашел наш анализатор. В примере ошибка из проекта OpenIDE:

public final class UsageType {
....
public static final UsageType
DELEGATE_TO_ANOTHER_INSTANCE_PARAMETERS_CHANGED = new UsageType(
UsageViewBundle.messagePointer(
"usage.type.delegate.to.another.instance.method.parameters.changed"
)
);

private static final Logger LOG = Logger.getInstance(UsageType.class);

public UsageType(@NotNull Supplier<....> nameComputable) {
myNameComputable = nameComputable;
if (ApplicationManager.getApplication().isUnitTestMode()) {
String usageTypeString = myNameComputable.get();
if (usageTypeString.indexOf('{') != -1) {
LOG.error(....);
}
}
}
....
}


Срабатывание анализатора PVS-Studio: V6050 Class initialization cycle is present. Initialization of 'DELEGATE_TO_ANOTHER_INSTANCE_PARAMETERS_CHANGED' appears before the initialization of 'LOG'. UsageType.java 46

Анализатор говорит, что мы имеем дело с циклической зависимостью при инициализации статических полей. Снова не самый очевидный момент, связанный с нюансами языка Java.
Для инициализации поля DELEGATE_TO_ANOTHER_INSTANCE_PARAMETERS_CHANGED используется конструктор. А в нём мы обращаемся к логгеру LOG.

Всё дело в том, что поля инициализируются в порядке их объявления. Как вы можете видеть, DELEGATE_TO_ANOTHER_INSTANCE_PARAMETERS_CHANGED располагается выше LOG, т.е. инициализируется раньше. Как следствие, LOG на момент исполнения конструктора будет равен null, и при обращении к нему мы столкнёмся с NPE.

Исправление, как и в большинстве случаев выше, будет донельзя простым. Нужно просто разместить объявление LOG выше, чем DELEGATE_TO_ANOTHER_INSTANCE_PARAMETERS_CHANGED.

Не совершай такую ошибку в своем проекте! А узнать о других багах из проекта можно по этой ссылке 🔗

#java #programming #ошибка
Please open Telegram to view this post
VIEW IN TELEGRAM
53
OWASP Top 10 2025 — от кода к цепочке поставок: расширение границ безопасности

В статье мы рассмотрели новые категории уязвимостей из обновлённого списка OWASP Top 10 2025 и показали, как некоторые из этих угроз можно выявить с помощью статического анализатора PVS-Studio.

Подробности по ссылке

OWASP Top 10 — это список десяти наиболее опасных угроз безопасности веб-приложений. Он служит ориентиром для разработчиков, архитекторов и специалистов по информационной безопасности, помогая сосредоточиться на самых критических рисках при создании веб-приложений.


#article #java #csharp #owasp
Интересные срабатывания анализатора в коде open source проекта OpenAPI Generator

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

Подробности по ссылке

#java #opensource #статья
3
Применяем кодогенерацию в Java для решения алгоритмических задач

Часто задачи с деревьями на LeetCode решают "магическим" кодом. Но в энтерпрайзе важны читаемость и поддерживаемость на годы. И что делать, когда ещё и объём задачи такой, что на работу руками ушли бы недели? Разберём, как с этим помогает кодогенерация в новой статье.

Подробности по ссылке 🔗

#java #статья
2
При сборке Java приложения в нативный образ требуются настройки для работы рефлексии, прокси и других динамических механизмов Java. Зачем, если JVM справлялась с этим сама? Разбираем отличия между миром статической компиляции и динамической Java.

Все подробности по ссылке 🔗

#статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Джависты, задачка для вас! Наш анализатор в этом фрагменте кода из проекта LanguageTool нашел ошибку. Сможете ли вы? 🧐

private String removeOldDiacritics(String s) {
return s
.replace("contrapèl", "contrapel")
.replace("Contrapèl", "Contrapel")
.replace("vés", "ves")
.replace("féu", "feu")
.replace("desféu", "desfeu")
.replace("adéu", "adeu")
.replace("dóna", "dona")
.replace("dónes", "dones")
.replace("sóc", "soc")
.replace("vénen", "venen")
.replace("véns", "véns")
.replace("fóra", "fora")
.replace("Vés", "Ves")
.replace("Féu", "Feu")
.replace("Desféu", "Desfeu")
.replace("Adéu", "Adeu")
.replace("Dóna", "Dona")
.replace("Dónes", "Dones")
.replace("Sóc", "Soc")
.replace("Vénen", "Venen")
.replace("Véns", "Vens")
.replace("Fóra", "Fora");
}


Ответ и другие интересные ошибки из проекта можно найти по ссылке 🔗

#java #ошибка
Please open Telegram to view this post
VIEW IN TELEGRAM
PVS-Studio: поиск ошибок в коде
А еще предлагаем потихоньку планировать конец месяца 😏 Мы, например, готовим два новых вебинара! И приглашаем вас присоединиться! 1️⃣ Онбординг 2026 Как быстро и безболезненно включать новых сотрудников в работу? Что действительно работает в онбординге…
А мы еще один цикл вебинаров готовим! 🔥

Тема: "Современный Gradle для Java-разработчика: один модуль — хорошо, несколько — лучше"

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

🗓 29 апреля в 13:30

Ссылка на регистрацию 🔗

#вебинар #java
Please open Telegram to view this post
VIEW IN TELEGRAM
32
⚡️Вышла уже 26 версия Java. В этом релизе реализовали множество фич, направленных на оптимизацию выполнения Java приложений, а также в нём отказались от поддержки апплетов.

Обо всех этих и других нововведениях расскажем в статье 🔗

#статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Друзья, рады поделиться записью первого вебинара из цикла "Современный Gradle для Java-разработчика" 🔥

В первом вебинаре Егор Пиший, Java-разработчик в PVS-Studio, рассказал, зачем в современных проектах нужны модули и как они помогают масштабировать кодовую базу без хаоса.

Посмотреть вебинар можно тут:
- наш сайт
- VK Video
- Rutube
- YouTube

Зарегистрироваться на цикл можно по этой ссылке 🔗

#java #вебинар
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Фрагмент кода одного из самого большого Open Source проекта на JavaElasticsearch. Попробуйте найти ошибку 😉

#java #ошибка
Please open Telegram to view this post
VIEW IN TELEGRAM
Gradle активно развивается, и вместе с ним появляются удобные инструменты: Version Catalog, Convention Plugins, улучшенная агрегация отчётов. В новом цикле вебинаров разберём, как ими пользоваться в реальном мультимодульном проекте. На каждой встрече берём задачу и разбираем её вживую в терминале и редакторе. К концу цикла постепенно вырастает цельный проект на актуальном стеке, который можно использовать как шаблон для новых проектов.

Мы уже провели ознакомительный вебинар, на котором подробнее рассказали, что вас ждет. Посмотреть можно тут 👈🏻

А уже 4 июня в 14:00 будем обсуждать границы зависимостей в Gradle 🗓

Зарегистрироваться на цикл можно по этой ссылке 🔗

#java #gradle #вебинар
Please open Telegram to view this post
VIEW IN TELEGRAM
4
This media is not supported in your browser
VIEW IN TELEGRAM
Уже скоро новый вебинар из цикла "Современный Gradle для Java-разработчика"! 🔥

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

🗓 4 июня в 14:00 мы обсудим:

- Почему один модуль видит зависимости другого, а другой нет?
- Когда использовать api, а когда implementation?
- И почему неправильный выбор конфигурации приводит к утечке зависимостей, конфликтам версий и хаосу в проекте?

Регистрация доступна по ссылке 🔗

#java #gradle #вебинар
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Ошибка из проекта Custom NPC+. Сможете отыскать?

#java #ошибка
Продолжаем цикл вебинаров, посвященных современному Gradle для Java-разработчика 🔥

Когда версии разбросаны по модулям, один апгрейд библиотеки превращается в ручную правку в десяти местах с риском рассинхрона. Решаем эту проблему через gradle/libs.versions.toml: переносим все версии в одно место и получаем типобезопасные аксессоры libs.* с автодополнением в IDE. Разбираем BOM как способ зафиксировать согласованные версии целого набора библиотек одним алиасом.

🗓11 июня в 14:00

Регистрация доступна по ссылке 🔗

#вебинар #java #gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Проверили Elasticsearch и нашли ошибку. Сможете отыскать ее в этом фрагменте?

#java #ошибка
Продолжаем цикл вебинаров, посвященных современному Gradle для Java-разработчика 🔥

Тема: "Тесты прошли. Теперь собираем это в один отчёт"

Когда в проекте несколько модулей, каждый пишет отчёты тестов и покрытия независимо, и общую картину собрать вручную неудобно. Подключаем test-report-aggregation и jacoco-report-aggregation. Получаем единый HTML-отчёт тестов и единый JaCoCo-отчёт по всем модулям. Дополнительно ставим минимальный порог покрытия через JacocoCoverageVerification.

🗓 25 июня в 14:00

Регистрация доступна по ссылке 🔗

#вебинар #gradle #java
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Проверили Elasticsearch и нашли ошибку. Сможете отыскать ее в этом фрагменте?

#java #ошибка