Старое ПППП / Лабораторная работа №6 / Лабораторная работа №6. Статический анализатор кода FindBugs
.pdfПрактикум по промышленному программированию 2015. Лабораторная работа №6
Лабораторная работа №6 Статический анализатор кода FindBugs
Цель работы:ознакомиться со статическим анализатором кода FindBugs, научиться его использовать для нахождения потенциальных ошибок.
Необходимое ПО для практической части:JDK 8; IntelliJ IDEA 14 Community Edition; Gradle.
Теоретические сведения
Стати́ческий ана́лиз ко́да (англ. static code analysis) — анализ программного обеспечения, производимый (в отличие от динамического анализа) без реального выполнения исследуемых программ. В большинстве случаев анализ производится над какойлибо версией исходного кода, хотя иногда анализу подвергается какойнибудь вид объектного кода. Термин обычно применяют к анализу, производимому специальным программным обеспечением (ПО), тогда как ручной анализ называют «program understanding», «program comprehension» (пониманием или постижением программы).
Взависимости от используемого инструмента глубина анализа может варьироваться от определения поведения отдельных операторов до анализа, включающего весь имеющийся исходный код. Способы использования полученной в ходе анализа информации также различны — от выявления мест, возможно содержащих ошибки (утилиты типа Lint), до формальных методов, позволяющих математически доказать какиелибо свойства программы (например, соответствие поведения спецификации).
Впоследнее время статический анализ всё больше используется в верификации свойств ПО, используемого в компьютерных системах высокой надёжности, особенно критичных для жизни (safetycritical). Также применяется для поиска кода, потенциально содержащего уязвимости (иногда это применение называется Static Application Security Testing, SAST).
Большинство компиляторов (например, GNU C Compiler) выводят на экран «предупреждения» (англ. warnings) — сообщения о том, что код, будучи синтаксически правильным, скорее всего, содержит ошибку. Например:
int x;
int y = x+2; // Переменная x не инициализирована!
Это простейший статический анализ. У компилятора есть много других немаловажных характеристик — в первую очередь скорость работы и качество машинного кода, поэтому компиляторы проверяют код лишь на очевидные ошибки. Статические анализаторы предназначены для более детального исследования кода.
FindBugs
FindBugs — статический анализатор кода, который известен тем, что обнаружил ошибку в модели памяти Java. Программа использует статический анализ, чтобы найти потенциальные ошибки сотни различных типов в Java коде. Приложение распространяется и как отдельное десктопное приложение и как плагин к Eclipse, Netbeans, IntelliJ IDEA и Hudson.
FindBugs отлавливает так называемые bug patterns т.e. конструкции в коде, которые, скорее всего, являются ошибкой. Причем, для ее работы не обязательно иметь исходный код приложения на самом деле она выполняет анализ байткода, используя для этих целей библиотеку Apache BCEL (ByteCode Engineering Library). Таким образом, можно даже сторонние JARы проанализировать на наличие ошибок FindBugs может обрабатывать JAR, ZIPфайлы, и, конечно, classфайлы.
Практическая часть
С FindBugs можно работать из IntelliJ IDEA, подключив плагин FindbugsIDEA. (Подключение плагинов описано в лабораторной работе №1.) Ниже показана работа плагина версии 0.9.996 c IntelliJ IDEA версии 14.1.2.
После установки плагина и перезагрузки среды разработки возможности FindBugs станут доступны. Внизу появляется возможность вызова вида FindBugs.
1
Практикум по промышленному программированию 2015. Лабораторная работа №6
На скриншоте выделены кнопки “Проанализировать все файлы в проекте” и “Настройки анализа”. Для того, чтобы анализ покрывал все возможные недоработки и ошибки в коде, нужно в настройках анализа задать минимальный показываемый уровень предупреждений как “Низкий”.
После нажатия на кнопку “Проанализировать все файлы в проекте” будет проведен статический анализ всех файлов в проекте, и выведен отчет о найденных ошибках.
У каждой ошибки можно просмотреть её подробное описание, класс ошибки и приоритет (низкий, средний и высокий).
Описания всех ошибок можно посмотреть здесь: http://findbugs.sourceforge.net/bugDescriptions.html.
Отчет по ошибкам в формате XML или HTML можно сформировать с помощью кнопки .
2
Практикум по промышленному программированию 2015. Лабораторная работа №6
Интеграция FindBugs и Gradle
В Gradle возможно вызывать проверку кода с помощью FindBugs. Подробнее про плагин findbugs в gradle здесь: http://gradle.org/docs/current/userguide/findbugs_plugin.html.
Необходимый сниппет для файла build.gradle: apply plugin: 'findbugs'
findbugs {
ignoreFailures = true effort = "max" reportLevel = "low"
}
tasks.withType(FindBugs) { reports { xml.enabled = false html.enabled = true
}
}
В этом сниппете также задана генерация отчетов в формате HTML. Они помещаются в директорию \build\reports\findbugs\. Задача, выполняющая все необходимые действия для проверки кода check (она вызывает задачу findbugsMain, но findbugs работает с байткодом, поэтому предварительно необходимо скомпилировать код. Поэтому лучше для статической проверки использовать команду check).
Задание для самостоятельной работы
Задание выполняется индивидуально.
Необходимо проверить с помощью FindBugs свои выполненные лабораторные работы №3 и 5. Сгенерировать HTMLотчеты об ошибках. Ошибки необходимо исправить. В лабораторной работе №5 статический анализ организовать с помощью Gradle.
Литература, ссылки
1.https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D 1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_% D0%BA%D0%BE%D0%B4%D0%B0
2.http://habrahabr.ru/post/198938/
3.http://jdevnotes.blogspot.jp/2009/06/findbugs.html
3