Инструмент динамического анализа Java-приложений «Coffee»
Инструмент находится на стадии разработки! 3 ноября 2011
Инструмент «Coffee» предназначен для обнаружения ошибок в программах, написанных на языке Java, путем генерации набора входных данных. Предполагается, что известен только байт-код приложения, то есть набор .class файлов или файл .jar.
Входные данные подбираются таким образом, чтобы на следующей итерации работы инструмента выполнение исследуемого приложения покрыло как можно больше ранее непросмотренных путей. Подбор происходит на основе анализа потока помеченных данных.
Инструмент состоит из трёх основных компонентов:
  • Espresso — инструментирование .class файлов;
  • Latte — частичная интерпретация трассы и анализ потока помеченных данных;
  • Glace — разбор трассы STP.

Инструментирование

На первом этапе работы инструмента происходит инструментирование байт-кода исходного класс-файла и всех используемых класс-файлов. Необходимый список классов, используемый тестируемой программой определяется рекурсивно. На каждой итерации модулем Espresso в список добавляются классы, вызовы функций которых присутствуют в непросмотренных классах, находящихся в списке.
Модуль Mokka, к которому обращается Espresso, анализирует и инструментирует отдельный класс-файл. Для работы с байт-кодом используется библиотека BCEL.
Сњема и?ьэъюме?эа
#1

Схема инструмента

При инструментировании в байт-коде класс-файла на каждую содержащуюся в нём инструкцию добавляются три инструкции (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

Сњема и?ьэъюме?эа
#2

Схема инструмента

Для подбора входных данных используется STP Constraint Solver. Модуль Latte производит анализ трассы, частичную интерпретацию и генерацию формул STP. На данном этапе отслеживается поток помеченных данных — информации, считанной из входных файлов, полученной в качестве аргументов командной строки, и информации, зависящей от неё. Например, если складываются две переменные, хотя бы одна из которых помечена, результат также будет помечен.

Анализ вывода STP

Модуль Glace производит анализ трассы STP и генерирует новый входной файл.
© Сергей Вартанов, 2007—2011
See also in English

ДАЛЬШЕ