Целью данной работы является моделирование механизмов нестабильности программного кода. Данная система была разработана на языке C#. «Моя работа» позволит облегчить тестирование программ.
Долгое время считалось, что динамический анализ программ является слишком тяжеловесным подходом к обнаружению программных дефектов, и полученные результаты не оправдывают затраченных усилий и ресурсов. Однако, две важные тенденции развития современной индустрии производства программного обеспечения позволяют по-новому взглянуть на эту проблему. С одной стороны, при постоянном увеличении объема и сложности ПО любые автоматические средства обнаружения ошибок и контроля качества могут оказаться полезными и востребованными. С другой – непрерывный рост производительности современных вычислительных систем позволяет эффективно решать все более сложные вычислительные задачи. Последние исследовательские работы в области динамического анализа такие, как SAGE, KLEE и Avalanche, демонстрируют, что несмотря на присущую этому подходу сложность, его использование оправдано, по крайней мере, для некоторого класса программ.
На мой взгляд, актуальность выбранной мной темы заключается в том, что моделирование механизмов нестабильности и выявление неадекватного поведения программ является очень насущно проблемой среди программистов.
Объектом исследования в работе является программный код. Предметом – моделирование нестабильности его поведения.
Задачи в ходе разработки проекта:
1. Провести обзор понятия динамический и статический анализ.
2. Рассмотреть методики тестирования программ.
3. Осуществить моделирование окружения.
4. Рассмотреть результаты моделирования.
Читать дальше
1.1 Обзор понятия динамический и статический анализ
В качестве более эффективной альтернативы динамическому анализу часто рассматривают статический анализ. В случае статического анализа поиск возможных ошибок осуществляется без запуска исследуемой программы, например, по исходному коду приложения. Обычно при этом строится абстрактная модель программы, которая, собственно, и является объектом анализа [8].
При этом следует подчеркнуть следующие характерные особенности статического анализа:
Возможен раздельный анализ отдельно взятых фрагментов программы (обычно отдельных функций или процедур), что дает достаточно эффективный способ борьбы с нелинейным ростом сложности анализа.
Возможны ложные срабатывания, обусловленные либо тем, что при построении абстрактной модели некоторые детали игнорируются, либо тем, что анализ модели не является исчерпывающим.
При обнаружении дефекта возникают, во-первых, проблема проверки истинности обнаруженного дефекта (false positive) и, во-вторых, проблема воспроизведения найденного дефекта при запуске программы на определенных входных данных.
В отличие от статического анализа, динамический анализ осуществляется во время работы программы. При этом:
Для запуска программы требуются некоторые входные данные.
Динамический анализ обнаруживает дефекты только на трассе, определяемой конкретными входными данными; дефекты, находящиеся в других частях программы, не будут обнаружены.
В большинстве реализаций появление ложных срабатываний исключено, так как обнаружение ошибки происходит в момент ее возникновения в программе; таким образом, обнаруженная ошибка является не предсказанием, сделанным на основе анализа модели программы, а констатацией факта ее возникновения.
Читать дальше
2.1 Моделирование окружения
Кроме перехвата системных вызовов, для автоматической генерации условий для “решателя” булевских формул, анализаторам необходимо формализовать задачу. Входной файл, набор регистров и адресное пространство (память) программы представляются c помощью массивов булевского “решателя”.
Перебор путей в программе
Получив ответ от “решателя”, инструмент получает условие на входные данные для инвертирования исследуемого условного перехода или выясняет, что оно всегда истинно или ложно. Каждый вариант условия создает новый независимый путь в программе, и программе приходится рассматривать каждый путь и условия для его выполнения независимо, т.е. пути “форкаются” на каждой инструкции ветвления, зависящей от входных данных. Новые входные данные могут открыть ранее не открытые базовые блоки исследуемой программы и так далее. Для исчерпывающего тестирования необходим полный перебор всех возможных путей в программе. Так как скорость роста количества путей хоть и значительно снизилась по сравнению с методом грубой силы (~O(2^n), где n – количество условных переходов, зависящих от входных данных), но все еще остается значительной. Анализаторы вынуждены использовать различные эвристики для приоритезации анализа некоторых путей. В частности, различают выбор пути, покрывающего наибольшее количество непокрытых (новых) базовых блоков (Avalanche, KLEE) и выбор случайного пути (KLEE) [7].
Avalanche – инструмент обнаружения программных дефектов при помощи динамического анализа. Avalanche использует возможности динамической инструментации программы, предоставляемые Valgrind, для сбора и анализа трассы выполнения программы. Результатом такого анализа становится либо набор входных данных, на которых в программе возникает ошибка, либо набор новых тестовых данных, позволяющий обойти ранее не выполнявшиеся и, соответственно, еще не проверенные фрагменты программы. Таким образом, имея единственный набор тестовых данных, Avalanche реализует итеративный динамический анализ, при котором программа многократно выполняется на различных, автоматически генерированных тестовых данных, при этом каждый новый запуск увеличивает покрытие кода программы такими тестами [4].
Читать дальше
Безусловно, динамический анализ найдет свою нишу среди инструментов, помогающих отдельным программистам и командам программистов решать поставленную задачу, т.к. является эффективным способом нахождения ошибок в программах, а также доказательством их отсутствия. В некоторых случаях подобные инструменты просто жизненно необходимы (Mission critical software: RTOS, системы управления производством, авиационное программное обеспечение и так далее).
Читать дальше
1. Гохберг Г.С. Информационные технологии : учебник для студ. учреждений сред. проф. образования / Г.С.Гохберг, А.В.Зафиевский, А.А.Короткин. — М. : Издательский центр «Академия», 2017. — 240 с.
2. Коберн, А. Современные методы описания функциональных требований к системам: Учебник / А. Коберн. - М.: Лори, 2018. - 263 с.
3. Коваленко, А.П. Глоссарий терминов в сфере информатизации : монография / Коваленко А.П. — Москва : Русайнс, 2020. — 416 с.
4. Корячко В. П., Таганов А. И. Процессы и задачи управления проектами информационных систем./М.: Горячая линия-Телеком, 2018. 376 с.
5. Ляхович, В.Ф. Основы информатики : учебник / Ляхович В.Ф., Молодцов В.А., Рыжикова Н.Б. — Москва : КноРус, 2020. — 347 с.
6. Макарова, Н.В. Основы программирования : учебник / Макарова Н.В., Нилова Ю.Н., Зеленина С.Б., Лебедева Е.В. — Москва : КноРус, 2021. — 451 с.
7. Мясникова, Н.А. Алгоритмы и структуры данных : учебное пособие / Мясникова Н.А. — Москва : КноРус, 2021. — 185 с.
8. Морозова, О.А. Информационные системы управления портфелями и программами проектов : учебное пособие / Морозова О.А. — Москва : КноРус, 2021. — 266 с.
9. Новожилов Е.О. Компьютерные сети : учеб. пособие для студ. учреждений сред. проф. образования / Е.О.Новожилов, О.П.Новожилов. — 5-е изд., стер. — М. : Издательский центр «Академия», 2017. — 224 с.
10. Назаров, С.В. Эффективность и оптимизация компьютерных систем : монография / Назаров С.В. — Москва : Русайнс, 2019. — 219 с.
11. Прохорский, Г.В. Информатика : учебное пособие / Прохорский Г.В. — Москва : КноРус, 2020. — 240 с.
Читать дальше