Автоматик коде. СанктПетербургский государственный
Скачать 0.58 Mb.
|
ВведениеНа текущий момент исследования, изучающие исправление ошибок в программном коде, бурно развиваются. Всё это связано с тем, что процесс поиска и исправления ошибок является не только утомитель- ным и трудоемким, но и очень часто повторяющимся процессом. Чтобы исправить ошибку, разработчику необходимо: проанализировать отчёт об ошибке, понять проблему, локализовать дефект, выполнить исправ- ление и проверить новый код на регрессионных тестах – что является нетривиальной задачей. Можно выделить основные направления в области автоматического исправления ошибок: исправляющие определенный класс ошибок; использующие символьное исполнение; системы генерации и валидации исправлений (generate-and-validate systems). Многие эти системы имеют проблему масштабируемости: инстру- менты, хорошо работающие на маленьких примерах, плохо работают на реальных больших проектах (около 100 тыс. строк кода). Одним из немногих инструментов, решающих данную проблему, является Prophet[10]. Prophet – инструмент, исправляющий ошибки в программном ко- де посредством генерации, ранжирования и проверки упорядоченных исправлений на тестовом наборе данных. Prophet умеет исправлять шесть классов ошибок, которые исправляются путем изменения одного места программы. Например, классы ошибок, исправляемые добавле- нием условия перед утверждением или заменой утверждения. Данное множество не является полным, поэтому данная работа направлена на расширение набора ошибок, исправляемых Prophet. Постановка задачиЦелью данной выпускной квалификационной работы является до- бавление поддержки исправления новых классов ошибок в инструмент Prophet[10]. Для достижения данной цели были поставлены следующие задачи. Реализовать генерацию исправлений для новых классов ошибок. Расширить модель корректного кода. Провести экспериментальные исследования работы алгоритма. Обзор предметной областиОсновные подходы автоматического исправле- ния ошибок в программном кодеНа данный момент область занимающаяся исправлением ошибок бурно развивается. Основные методы исправления ошибок можно поделить поклас- су исправляемых ошибок. Есть инструменты, которые направле- ны на исправление конкретных классов ошибок, например на утечки памяти[13], пропуск вызова библиотечной функции[23] и другие[3, 6]. В противоположность им есть системы, исправляющие широкий набор часто встречающихся ошибок. Эти системы можно поделить по вход-нымспецификациям. Есть два основных подхода специфицирования поведения системы: декларативными спецификациями[1, 14] или тестовым набором. Недо- статком первого подхода является плохая масштабируемость: тяжело написать спецификации для реального большого проекта. Второй под- ход, хотя накладывает более слабые ограничения на проект, требует для корректности работы полноты тестового набора. Данное требова- ние необходимо для отсутствия генерации правдоподобных, но непра- вильных исправлений. Методы, использующие тестовый набор, можно поделить помето- дампоискаигенерацииисправлений: методы использующие символьное исполнение[4, 11, 12, 15], системы генерации и валидации исправлений[2, 5, 9, 10, 19, 20]. Оба метода могут работать на больших реальных проектах. Напри- мер, в программе-анализаторе трафика сети Wireshark около 2814 тыс. строк кода. Основной задачей первого подхода является поиск проти- воречий в исходном коде с помощью символьного исполнения на те- стовом наборе и дальнейшее его решение с помощью smt-решателей[7]. Второй подход направлен на улучшение генерации исправлений и даль- нейшего обхода. Например, среди систем генерации и валидации есть инструменты, которые используют для генерации другие приложения- доноры[2, 5], генетическое программирование[20], алгоритм рандомного поиска[19] или детерминированные алгоритмы[9, 16]. Одна из важных проблем систем генерации и валидации исправле- ний – это генерация правдоподобных исправлений, которые проходят все тесты, но являются неправильными[12, 17]. Например, к таким ис- правлениям относятся исправления, удаляющие функциональность. В результате могут отключаться необходимые проверки или не выпол- няться необходимые действия в коде. Главная причина генерации и успешного прохождения верификации неправильных исправлений – это неполнота тестового набора. Поэтому важной задачей систем генерации и валидации исправлений является приоритезация правильных исправлений среди правдоподобных. Ин- струмент Prophet[10] хорошо справляется с данной задачей в основном из-за алгоритма ранжирования исправлений, который использует ма- шинное обучение. |