| Инструмент динамического анализа Java-приложений «Coffee» |
← СТРАНИЦА 68 → |
|
|
| Инструмент находится на стадии разработки! 3 ноября 2011 | |
| Инструмент «Coffee» предназначен для обнаружения ошибок в программах, написанных на языке Java, путем генерации набора входных данных. Предполагается, что известен только байт-код приложения, то есть набор .class файлов или файл .jar. | |
| Входные данные подбираются таким образом, чтобы на следующей итерации работы инструмента выполнение исследуемого приложения покрыло как можно больше ранее непросмотренных путей. Подбор происходит на основе анализа потока помеченных данных. | |
| Инструмент состоит из трёх основных компонентов: | |
- Espresso — инструментирование .class файлов;
- Latte — частичная интерпретация трассы и анализ потока помеченных данных;
- Glace — разбор трассы STP.
| |
Инструментирование | |
| На первом этапе работы инструмента происходит инструментирование байт-кода исходного класс-файла и всех используемых класс-файлов. Необходимый список классов, используемый тестируемой программой определяется рекурсивно. На каждой итерации модулем Espresso в список добавляются классы, вызовы функций которых присутствуют в непросмотренных классах, находящихся в списке. | |
| Модуль Mokka, к которому обращается Espresso, анализирует и инструментирует отдельный класс-файл. Для работы с байт-кодом используется библиотека BCEL. | |
 | |
| При инструментировании в байт-коде класс-файла на каждую содержащуюся в нём инструкцию добавляются три инструкции (getstatic — получение потока вывода, push — запись выводимой строки в стек, invokevirtual — вызов функции println()), выводящие на экран номер инструкции, её код и входные параметры. В некоторых местах также добавляются инструкции печати вершины стека и значений регистров JVM. | |
| Например, вместо команды new (2) в байт-коде появятся четыре следующие команды. Первые три из них печатают текст main 0 187 java/io/FileReader на экран. | |
0: getstatic java.lang.System.out Ljava/io/PrintStream; (51) 3: ldc "main 0 187 java/io/FileReader" (67) 5: invokevirtual java.io.PrintStream.println (Ljava/lang/String;)V (56) 8: new <java.io.FileReader> (2)
| |
Извлечение трассы | |
| При запуске проинструментированная описанным образом программа печатает на экран свою трассу. | |
Анализ трассы и генерация формул STP | |
 | |
| Для подбора входных данных используется STP Constraint Solver. Модуль Latte производит анализ трассы, частичную интерпретацию и генерацию формул STP. На данном этапе отслеживается поток помеченных данных — информации, считанной из входных файлов, полученной в качестве аргументов командной строки, и информации, зависящей от неё. Например, если складываются две переменные, хотя бы одна из которых помечена, результат также будет помечен. | |
Анализ вывода STP | |
| Модуль Glace производит анализ трассы STP и генерирует новый входной файл. | |
|
|
|
Схема инструмента