JavaRush /Java блог /Random /Кофе-брейк #94. Обзор пяти статических анализаторов Java-...

Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java

Статья из группы Random

Обзор пяти статических анализаторов Java-кода

Источник: DZone Разработчикам часто требуются различные программы, в том числе статические анализаторы кода, которые могут найти и исправить ошибочный код на ранних этапах разработки. Несмотря на то, что ревью кода — незаменимый помощник в этом деле, иногда количество кода, которое рецензенты должны просмотреть и продумать, ужасает. На это уходит много времени и сил. Также это приводит к тому, что рецензенты часто обращают внимание только на критичные для работы программы фрагменты кода. Тогда как инструменты статического анализа проверяют весь код с одинаковой точностью. Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java - 1Я собрал несколько анализаторов кода, совместимых с IntelliJ IDEA. Надеюсь, это поможет вам в вашей работе.

Встроенный анализатор IntelliJ IDEA

Статический анализатор Java-кода, встроенный в IntelliJ IDEA, ничем не уступает специализированным инструментам статического анализа. Поиск подозрительных, захламленных или некорректных фрагментов кода осуществляется с помощью различных методов статического анализа: анализа потока данных и сопоставления с образцом. IntelliJ IDEA имеет большое количество инспекций. По правде говоря, многие из них не всегда точно сообщают об ошибке. Скорее указывают на небрежность в коде или на возможность изменить ее аккуратной альтернативой. Немного изучив “Inspections → Java”, я заметил одну вещь. Инспекции по категориям вероятных ошибок, числовых проблем и проблем сериализации с большей вероятностью обнаружат настоящие ошибки. В любом случае, вы должны сами провести проверки и определить, какие из них будут полезны для вашего проекта. Поскольку статический анализ выполняется в режиме редактирования кода, в IntelliJ IDEA вы можете исправлять ошибки через несколько секунд после их появления. Редактор сразу выделяет некорректный фрагмент кода. Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java - 2Это действительно удобно и круто! Кроме того, если вы используете комбинацию “Alt + Enter” на выделенном фрагменте кода, вы можете выбрать один из вариантов, чтобы исправить ошибку через контекстное меню: Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java - 3Также вы можете узнать причину запуска той или иной инспекции. В некоторых случаях это сокращает время поиска: Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java - 4Вы можете запустить анализ вручную, выбрав “Анализировать → Проверить код”. Или можно запустить индивидуальную проверку с помощью “Анализировать → Выполнить проверку по имени”. Перед этим укажите область анализа (для проекта, модуля или отдельного файла). Когда вы запускаете анализ таким образом, становятся доступными некоторые инспекции, которые не работают в режиме редактирования из-за сложности. После анализа результаты будут сгруппированы по категориям / каталогам в отдельном окне. Из этого окна вы можете перейти к определенному триггеру проверки: Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java - 5IntelliJ позволяет сохранять результат анализа только в форматах HTML и XML. К сожалению, на мой взгляд, удобнее всего работать с обнаруженными проблемами в самой IDE. Примечание. Большинство функций статического анализатора доступны в бесплатной версии IntelliJ IDEA Community Edition.

SonarJava

SonarJava — это статический анализатор кода для Java от SonarSource. В перечень его функций входит:
  • 150+ правил обнаружения ошибок;
  • 350+ правил распознавания запахов кода;
  • 40+ правил обнаружения потенциальных уязвимостей;
  • Интеграция с Maven, Gradle, Ant, Eclipse, IntelliJ IDEA, VS Code;
  • Возможность расширения с помощью настраиваемых диагностических правил;
  • Специализированный инструмент SAST: большинство диагностических правил составлено в соответствии с CWE, CERT, OWASP.
Запускать анализ можно как в различных IDE (через плагин SonarLint), так и отдельно в SonarQube. SonarLint умеет работать бок о бок со встроенным анализатором кода IntelliJ IDEA. Если навести курсор на выделенный фрагмент кода, часто можно увидеть предупреждения от обоих анализаторов: Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java - 6Конечно, вы можете просмотреть предупреждение в отдельном окне: Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java - 7В целом, возможность запускать SonarJava по-разному делает его привлекательным. Это дает разработчикам свободу выбора инструмента при написании кода.

FindBugs / SpotBugs

К сожалению, FindBugs уже давно не обновляется, последний стабильный релиз был выпущен еще в 2015 году. Но мы по-прежнему его помним и используем, так как это, пожалуй, самый известный бесплатный статический анализатор кода Java. Если вы спросите Java-разработчика о статическом анализе, то он, вероятно, сразу же вспомнит FindBugs. Анализатор с открытым исходным кодом SpotBugs стал логическим продолжением заброшенного FindBugs. В нем присутствуют все преимущества и недостатки FindBugs. Время покажет, хорошо это или плохо. А пока сообщество анализаторов его активно развивает. Основные возможности SpotBugs:
  • 400+ правил обнаружения ошибок;
  • Интеграция в Ant, Maven, Gradle, Eclipse, IntelliJ IDEA;
  • Возможность расширения с помощью настраиваемых диагностических правил.
Для поиска подозрительного кода используются все те же методологии: сопоставление с образцом и анализ потока данных. Анализатор обнаруживает различные типы ошибок, которые связаны с многопоточностью, производительностью, уязвимостями, обфускацией кода и так далее. В IntelliJ IDEA окно предупреждений выглядит так: Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java - 8Предупреждения можно сгруппировать по категориям, классам, каталогам и уровню достоверности. Вы можете одновременно просматривать предупреждения и документацию по любому диагностическому правилу. Анализ запускается вручную. После анализа все проблемные фрагменты кода выделяются вместе с другими предупреждениями от IntelliJ IDEA и SonarLint. Однако есть проблема. Вы должны перезапустить анализ, чтобы обновить предупреждения в соответствии с внесенными вами изменениями файла. Также существует множество рекомендательных предупреждений, поэтому перед активным использованием необходимо настроить анализатор.

PVS-Studio

PVS-Studio основан на библиотеке с открытым исходным кодом Spoon. Он получает исходный код в качестве входных данных и строит хорошо спроектированную модель AST с семантической информацией. На основе этой модели в анализаторе используются такие современные методики, как:
  • Анализ потока данных;
  • Символическое исполнение;
  • Аннотации методов;
  • Анализ на основе шаблонов.
На данный момент анализатор использует более 105 диагностических правил, выявляющих на различные недостатки кода. Они включают в себя исправление опечаток, переименование null-ссылок, недостижимый код, индекс массива вне границ, нарушение использования договора метода и другие ошибки. Вы можете узнать все возможности диагностических правил здесь. Основные функции PVS-Studio:
  • Анализатор ориентирован на поиск реальных ошибок;
  • Помимо версии CLI, есть также интеграция с IntelliJ IDEA, Maven, Gradle, Jenkins, SonarQube;
  • Возможность запуска анализатора в инкрементальном режиме;
  • Анализатор выявляет потенциальные проблемы совместимости с Java SE API при переносе проекта с Java 8 на более свежие версии;
  • PVS-Studio конвертирует отчет в различные удобные для пользователя форматы: JSON, XML, HTML, TXT;
  • Специализированный инструмент SAST: большинство диагностических правил составлено в соответствии с CWE, CERT, OWASP.

PMD

PMD — это статический анализатор с открытым исходным кодом. Он выявляет типичные ошибки разработки: неиспользуемые переменные, пустые блоки, создание ненужных объектов и другие проблемы. В качестве входных данных анализатор использует исходный код. В данный момент PMD анализирует один исходный файл в течение одного процесса работы, что накладывает ограничения на полноту анализа. Авторы PMD советуют собирать проект перед анализом. Это позволяет извлекать информацию о типах, используемых в анализируемом коде. Основные функции PMD:
  • Интеграция с различными IDE (IntelliJ IDEA, Eclipse, NetBeans) и системами сборки (Maven, Gradle, Ant);
  • Поддерживает различные форматы отчетов анализатора: SARIF, CSV, IDEA, JSON, текст (по умолчанию), XML, HTML, TextColor и так далее;
  • Имеет более 300 шаблонов диагностических правил. Категории: стиль кодирования, лучшие практики, ошибки, многопоточность, производительность и так далее;
  • Поставляет CPD (детектор копирования-вставки) вместе с PMD, который обнаруживает дубликаты в коде.
Если мы посмотрим на все диагностические правила, то PMD больше ориентирован на решение проблем стиля кодирования и обнаружение очевидных ошибок. Правила диагностики могут противоречить друг другу, поэтому их необходимо настроить перед использованием анализатора. Вы также можете запустить анализ через плагин для IntelliJ IDEA, но вы не можете выбрать отдельные файлы для анализа. Окно предупреждения выглядит так: Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java - 9На мой взгляд, работать с предупреждениями не очень удобно, так как их невозможно сгруппировать по файлам и неочевидным сообщениям. Они появляются только при наведении курсора на предупреждение.

Заключение

Конечно, помимо выше рассмотренных анализаторов, есть и другие решения. Существуют как платные (Coverity, Klockwork, JArchitect), так и бесплатные (Error Prone, Infer, Checkstyle) программы. Все они сосредоточены на одном: предотвратить попадание некорректного или потенциально ошибочного кода в производство. Я не имею права судить, какой из анализаторов лучше подходит для этой задачи. Но анализаторы, разрабатывающие анализ потока данных и символьное выполнение, с большей вероятностью обнаружат реальную ошибку в коде. Если вы выбираете статический анализатор, обратите внимание на:
  • интеграция в различные IDE;
  • интеграция в системы сборки;
  • удобство запуска анализатора на сервере;
  • возможность обнаружения ошибок в режиме редактирования кода;
  • возможность удобной работы с предупреждениями;
  • ориентация на SAST;
  • процент ложных срабатываний;
  • сложность конфигурации.
  • Сочетание всех плюсов и минусов приведет вас к количеству статических анализаторов, которые вы сочтете лучшими.
Примечание: я привел примеры с интеграцией в IntelliJ IDEA, так как часто использую ее.

Ошибки в куче и стековой памяти Java

Источник: DZone Сейчас мы рассмотрим основные ошибки, которые могут возникнуть в куче или стековой памяти Java, но для начала давайте вспомним, что означают эти два термина.
  • Куча памяти — это специальная область памяти, в которой хранятся java-объекты.
  • Стековая память — область временной памяти для хранения переменных при вызове метода.
Основное исключение, которое описывает проблему с кучей памяти — это java.lang.OutOfMemoryError. Кофе-брейк #94. Обзор пяти статических анализаторов Java-кода. Ошибки в куче и стековой памяти Java - 10

Java Heap Space

Эта ошибка возникает, когда программе Java не удалось выделить новый объект в области памяти кучи.

GC Overhead Limit Exceeded

Программа Java тратит слишком много времени на сборку мусора. Такая ошибка появляется тогда, когда сборка мусора занимает 98% времени программы и восстанавливает менее 2% пространства памяти.

public class OutOfMemoryErrorDemo {
    public static void main(String[] args) {
        int i = 0;
        List<String> stringList = new ArrayList<>();
        while (i < Integer.MAX_VALUE) {
            i++;
            String generatedString = new String( "Some string generated to show out of memory error example " + i);
            stringList.add(generatedString);
        }
    }
}
Здесь stringList содержит ссылку на наши сгенерированные строки, поэтому сборщик мусора не может удалить сгенерированные строки из памяти, а пытается удалить любой другой мусор в приложении. Но этого недостаточно.

Запрошенный размер массива превышает предел виртуальной машины (Requested Array Size Exceeds VM Limit)

Ошибка возникает при попытке выделить массив, когда места в куче недостаточно.

public class OutOfMemoryErrorDemo {
    public static void main(String[] args) {
        // we try to create too long array
        long[] array = new long[Integer.MAX_VALUE];
    }
}

Метапространство (Metaspace)

Исключение выдается с этим сообщением, когда в области метапространства нет места для информации о данных класса.

Нет места для подкачки (Request Size Bytes for Reason. Out of Swap Space?)

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

reason stack_trace_with_native_method

Собственный интерфейс Java или собственный метод не смогли выделить память в куче. StackOverFlowError — когда слишком много вызовов методов. Обычно исключение вызывается методом, внутри которого есть рекурсия.

public class StackOverFlowErrorDemo {

    public static void main(String[] args) {
        recursiveMethod(2);
    }

    public static int recursiveMethod(int i) {
      	// it will never stop and it allocates all stack memory
        return recursiveMethod(i);
    }
}
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Павел Уровень 11
30 сентября 2021