Главная страница

Автоматик коде. СанктПетербургский государственный


Скачать 0.58 Mb.
НазваниеСанктПетербургский государственный
АнкорАвтоматик коде
Дата07.12.2022
Размер0.58 Mb.
Формат файлаdocx
Имя файлаAvtomaticheskoe_ispravlenie_oshibok_v_programmnom_kode.docx
ТипОбзор
#833783
страница4 из 8
1   2   3   4   5   6   7   8

Поддержка исправления новых классов ошибок

  1. Анализ тестового набора данных


Чтобы расширить пространство генерируемых исправлений, был про- анализирован тестовый набор данных[21], на основе которого оценива- лась работа Prophet и происходило сравнение с другими системами.

Данный датасет содержит 69 выявленных ошибок из реальных боль- ших проектов2. 19 примеров находятся в пространстве поиска Prophet и 18 из них исправляются. 50 ошибок находятся вне пространстве поиска Prophet, следовательно не могут быть исправлены инструментом.

Многие неподдерживаемые ошибки требуют нетривиальных исправ- лений и изменяют от двух мест в программе. Чтобы не накладывать дополнительные временные расходы на работу Prophet, при выборе но- вого класса ошибок для добавления в инструмент учитывались слож- ность необходимого изменения и требуемое увеличение размера поиско- вого пространства для исправления. В результате выбранный пример показан на рис 3.

Исходное исправление ошибки соответствует коммиту ecb9d80[8] в PHP интерпретаторе[18]. В функции php_json_encodeв первой строчке происходит зануление ошибки кодирования, что в общем случае некор- ректно из-за вложенности формата json файлов. Например, если json файл содержит массив объектов, то при кодировании программа не выявит ошибку, если последний элемент успешно пройдет процесс ко- дирования. Поэтому процесс зануления ошибки необходимо вынести до места в программе, где начинается обход json файла.

В общем случае данный класс ошибок можно определить, как ошиб- ки, исправляемые вынесением первого утверждения функции перед ко- дом, который вызывает эту функцию. Данное исправление изменяет два места в программе.

2Всего в исходном наборе данных содержится 105 примеров, но 36 из них не используются в оценке работы алгоритма, так как данные примеры отвечают за изменение функциональности и не содержат ошибок.


Рис. 3: Исправление ошибки php-308525-308529. Красный цвет показы- вает, какие утверждения необходимо удалить, чтобы код стал коррект- ным, а зеленый какие надо добавить
    1. Реализация исправления новых классов ошибок


Для генерации исправлений Prophet последовательно обходит подо- зрительные локации и для каждого запускает генерацию кандидатов. Упрощенная диаграмма классов показана на рис. 4.

RepairCandidateGenerator– класс, генерирующий всевозможные из- менения для подозрительной локации.

GlobalAnalyzer – класс, который хранит общую информацию для всех локаций из одного файла, например глобальные переменные.

LocalAnalyzer – класс, который для определенной локации (файла и номера строки) хранит всю необходимую для генерации информа- цию (в том числе GlobalAnalyzer файла), например название функции, в котором находится утверждение, утверждения-кандидаты на вставку перед данной локацией.

SourceContextManager – класс, обеспечивающий взаимодействие с исходным кодом, хранит информацию об имеющихся глобальных и ло- кальных анализаторах и позволяет по локации получить LocalAnalyzer.


Рис. 4: Упрощенная диаграмма классов Prophet для генерации исправ- лений в одной локации
Для поддержки исправления нового класса ошибок в RepairCandidateGeneratorбыла добавлена функция, генерирующая но- вые исправления вида FunctionMutation. Для этого происходит провер- ка, является ли подозрительное утверждение вызовом функции, иначе ничего не генерируется. Впоследствии перед подозрительным утвер- ждением добавляется первое утверждение вызываемой функции и в вызываемой функции удаляется соответствующее утверждение. При первом обходе файла (при инициализации GlobalAnalyzer) находятся все функции, которые определены в этом же файле и содержат простое первое утверждение. В рамках данной работы утверждение считается простым, если оно содержит только операции присваивания, вызовы функций, бинарные операции, но не объявление новых переменных. В результате обхода составляется хэш-таблица, сопоставляющая имя функции и локацию первого утверждения функции.

В LocalAnalyzerбыло добавлено извлечение названия функции из

утверждения и возврат локации первого утверждения, если оно су- ществует и соответствует вышеизложенным требованиям. В результа- те данная локация используется для нахождения и удаления первого утверждения функции.

Из-за ограничений на простоту первого утверждения в результате генерации в среднем добавляется не более 10 конкретных кандидатов, что очень важно, ведь чем больше пространство поиска, тем сложнее организовать обход.
  1. 1   2   3   4   5   6   7   8


написать администратору сайта