Введение 4
Постановка задачи 5
1. Обзор предметной области 6
1.1. Основные подходы автоматического исправления ошибок
в программном коде 6
1.2. Алгоритм работы инструмента Prophet 7
2. Поддержка исправления новых классов ошибок 11
2.1. Анализ тестового набора данных 11
2.2. Реализация исправления новых классов
ошибок 12
3. Расширенная модель корректного кода 15
3.1. Новые признаки и их извлечение 15
3.2. Обучение модели 15
4. Апробация 18
4.1. Схема эксперимента 18
4.2. Анализ результатов 18
4.3. Анализ признаков новой модели корректного кода .... 19
Заключение 24
Список литературы 25
На текущий момент исследования, изучающие исправление ошибок
в программном коде, бурно развиваются. Всё это связано с тем, что
процесс поиска и исправления ошибок является не только утомительным и трудоемким, но и очень часто повторяющимся процессом. Чтобы
исправить ошибку, разработчику необходимо: проанализировать отчёт
об ошибке, понять проблему, локализовать дефект, выполнить исправление и проверить новый код на регрессионных тестах – что является
нетривиальной задачей.
Можно выделить основные направления в области автоматического
исправления ошибок:
– исправляющие определенный класс ошибок;
– использующие символьное исполнение;
– системы генерации и валидации исправлений (generate-and-validate
systems).
Многие эти системы имеют проблему масштабируемости: инструменты, хорошо работающие на маленьких примерах, плохо работают
на реальных больших проектах (около 100 тыс. строк кода). Одним из
немногих инструментов, решающих данную проблему, является Prophet[10].
Prophet – инструмент, исправляющий ошибки в программном коде посредством генерации, ранжирования и проверки упорядоченных
исправлений на тестовом наборе данных. Prophet умеет исправлять
шесть классов ошибок, которые исправляются путем изменения одного
места программы. Например, классы ошибок, исправляемые добавлением условия перед утверждением или заменой утверждения. Данное
множество не является полным, поэтому данная работа направлена на
расширение набора ошибок, исправляемых Prophet.
В ходе выполнения данной работы были получены следующие результаты.
– Реализована генерация исправлений для новых классов ошибок,
исправляемых вынесением первого утверждения функции перед
вызывающим кодом.
– Расширена и обучена новая модель корректного кода посредством
добавления новых признаков для поддержки исправлений, изменяющих код в 2 местах программы, и добавления новых примеров
в тренировочный набор данных.
– Выявлены самые значимые признаки успешных исправлений и
проведен анализ влияния новых тренировочных примеров на параметры модели корректного кода.
В результате было расширено пространство генерируемых исправлений в инструменте Prophet[10] и исправлена ошибка из тестового набора данных. Исходный код данной работы представлен в репозитории
проекта[22].
[1] Automated fixing of programs with contracts / Yi Wei, Yu Pei, Carlo A Furia et al. // Proceedings of the 19th international symposium on Software testing and analysis / ACM. — 2010. — P. 61¬72.
[2] Automatic error elimination by horizontal code transfer across multiple applications / Stelios Sidiroglou-Douskos, Eric Lahtinen, Fan Long, Martin Rinard // ACM SIGPLAN Notices / ACM.- Vol. 50.¬2015. — P. 43-54.
[3] Automatic fix for C integer errors by precision improvement / Xi Cheng, Min Zhou, Xiaoyu Song et al. // Computer Software and Applications Conference (COMPSAC), 2016 IEEE 40th Annual / IEEE. — Vol. 1. — 2016. — P. 2-11.
[4] Automatic repair of buggy if conditions and missing preconditions with SMT / Favio DeMarco, Jifeng Xuan, Daniel Le Berre, Martin Monperrus // Proceedings of the 6th International Workshop on Constraints in Software Testing, Verification, and Analysis / ACM. — 2014. — P. 30-39.
[5] Automatically patching errors in deployed software / Jeff H Perkins, Sunghun Kim, Sam Larsen et al. // Proceedings of the ACM SIGOPS 22nd symposium on Operating systems principles / ACM. — 2009. — P. 87-102.
[6] Cheng Xi. RABIEF: range analysis based integer error fixing // Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering / ACM. — 2016. — P. 1094-1096.
[7] De Moura Leonardo, Bjprner Nikolaj. Satisfiability modulo theories: introduction and applications // Communications of the ACM. — 2011. — Vol. 54, no. 9. — P. 69-77.
[8] Fix Bug 54058, invalid utf-8 doesn’t set json_encode() in all cases.— URL: https://github.com/php/php-src/search?q=ecb9d80&type= Commits.
[9] Long Fan, Rinard Martin. Staged program repair with condition synthesis // Proceedings of the 2015 10th Joint Meeting on Foundations of Software Engineering / ACM. — 2015. — P. 166-178.
[10] Long Fan, Rinard Martin C. Automatic patch generation by learning correct code // POPL. — 2016.
[11] Mechtaev Sergey, Yi Jooyong, Roychoudhury Abhik. Directfix: Looking for simple program repairs // Proceedings of the 37th International Conference on Software Engineering-Volume 1 / IEEE Press. — 2015. — P. 448-458.
[12] Mechtaev Sergey, Yi Jooyong, Roychoudhury Abhik. Angelix: Scalable multiline program patch synthesis via symbolic analysis // Software Engineering (ICSE), 2016 IEEE/ACM 38th International Conference on / IEEE. — 2016. — P. 691-701.
[13] Safe memory-leak fixing for c programs / Qing Gao, Yingfei Xiong, Yaqing Mi et al. // Software Engineering (ICSE), 2015 IEEE/ACM 37th IEEE International Conference on / IEEE.— Vol. 1.— 2015.— P. 459-470.
[14] Samanta Roopsha, Olivo Oswaldo, Emerson E Allen. Cost¬aware automatic program repair // International Static Analysis Symposium / Springer. — 2014. — P. 268-284.
[15] Semfix: Program repair via semantic analysis / Hoang Duong Thien Nguyen, Dawei Qi, Abhik Roychoudhury, Satish Chandra // Proceedings of the 2013 International Conference on Software Engineering / IEEE Press. — 2013. — P. 772-781.
[16] Weimer Westley, Fry Zachary P, Forrest Stephanie. Leveraging program equivalence for adaptive program repair: Models and first results // Automated Software Engineering (ASE), 2013 IEEE/ACM 28th International Conference on / IEEE. — 2013. — P. 356-366.
[17] An analysis of patch plausibility and correctness for generate-and- validate patch generation systems / Zichao Qi, Fan Long, Sara Achour, Martin Rinard // Proceedings of the 2015 International Symposium on Software Testing and Analysis / ACM. — 2015. — P. 24-36.
[18] The source code of PHP interpreter.— URL: https://github.com/ php/php-src.
[19] The strength of random search on automated program repair / Yuhua Qi, Xiaoguang Mao, Yan Lei et al. // Proceedings of the 36th International Conference on Software Engineering / ACM. — 2014. — P. 254-265.
[20] A systematic study of automated program repair: Fixing 55 out of 105 bugs for $8 each / Claire Le Goues, Michael Dewey-Vogt, Stephanie Forrest, Westley Weimer // Software Engineering (ICSE), 2012 34th International Conference on / IEEE. -- 2012. -- P. 3-13.
[21] A systematic study of automated program repair: Fixing 55 out of 105 bugs for $8 each / Claire Le Goues, Michael Dewey-Vogt, Stephanie Forrest, Westley Weimer // Software Engineering (ICSE), 2012 34th International Conference on / IEEE. -- 2012. -- P. 3-13.
[22] Исходный код инструмента Prophet с расширенным простран¬ством исправляемых классов ошибок.— URL: https://github. com/Guzele/prophet-src.
[23] Якимов Иван Александрович, Кузнецов Александр Сергеевич. По¬иск недостающих вызовов библиотечных функций с использовани¬ем машинного обучения // Труды института системного програм¬мирования РАН. — 2017. — Т. 29, № 6. — С. 117-134.