Автоматическое исправление ошибок
Автоматическое исправление ошибок (англ. Automatic bug-fixing) — это автоматическое устранение ошибок в программном обеспечении, осуществляемое без участия программмиста-человека.[1][2][3] Это направление также известно как автоматическая генерация патчей, автоматическое исправление ошибок или автоматическое восстановление программ[3]. Обычной целью таких подходов является автоматическая генерация корректных патчей для устранения ошибок в программах, при этом не должно допускаться регрессий, то есть усугубления состояния ПО[4].
Спецификация
Автоматическое исправление ошибок производится на основе спецификации ожидаемого поведения, которой может быть, например, формальная спецификация или набор тестов[5].
Набор тестов — пары входных и выходных данных, специфицирующие функциональность программы, часто фиксируемые в утверждениях, — может быть использован в качестве тестового оракула для управления поиском. Такой оракул условно делят на оракул ошибки (фиксирующий дефектное поведение) и оракул регрессии (гарантирующий сохранение функций, которые должен сохранять исправленный код). Однако тест-набор обычно неполон и не покрывает все случаи, вследствие чего может быть создан патч, успешно проходящий тесты, но неверно работающий на других входах[6]. Существование таких патчей — одна из главных проблем generate-and-validate-методов[6]. Современные успешные технологии автоматического исправления ошибок часто используют дополнительную информацию, например, модели, обученные на предыдущих человеческих исправлениях, чтобы выбирать более корректные патчи среди прошедших тесты[7].
Другой способ специфицировать ожидаемое поведение — применять формальные спецификации[8]. Проверка на полноту спецификации (то есть, покрывающей все функции) встречается реже из-за недоступности таковых в индустрии и высокой вычислительной стоимости формальной верификации. Однако для отдельных классов ошибок возможны неявные частичные спецификации — например, целевые методы для предотвращения выхода за границы переполнения в выбранных местах программы.
Технологии
Генерация и валидация (generate-and-validate)
Методы generate-and-validate компилируют и тестируют каждый кандидат-патч, собирая патчи, проходящие набор тестов[5]. Обычно это начинается с набора тестов, среди которых есть кейс, воспроизводящий ошибку[5][7][9][10]. Одной из ранних систем данного класса является GenProg[5]. Эффективность generate-and-validate методов часто дискутируется из-за отсутствия гарантии корректности патча.[6] Тем не менее, результаты современных подходов показывают многообещающие успехи. Например, система Prophet на стандартной коллекции из 69 ошибок в восьми крупных C-программах сгенерировала корректные патчи для 18 ошибок[7].
Одним из способов генерации кандидатных патчей является применение мутационных операторов: они модифицируют исходную программу, например через её абстрактное синтаксическое дерево, либо на уровне операторов/блоков. Ранние подходы генетического улучшения работали на уровне операторов, реализуя простые удаления/замены инструкций[5][11]. Новейшие методы работают на более детальных представлениях AST для создания большего разнообразия патчей[10]. Особенно удаление инструкций (statement deletion), а также более общие удаления кода, оказываются эффективны по локализации ошибок[12].
Другой подход к генерации патчей — использование шаблонов исправлений. Шаблоны — это заранее заданные модификации для определённых классов багов (например, вставка условного оператора для проверки значения на null, с целью устранения NullPointerException, либо изменение целочисленной константы на 1 для исправления ошибок типа off-by-one)[13].
Основанные на синтезе
Некоторые техники используют символическое исполнение. Например, Semfix[14] применяет символическое выполнение для извлечения ограничений на исправление. Angelix[15] ввёл концепцию «ангельского леса» для поддержки многострочных патчей.
В некоторых случаях задача исправления формулируется как задача синтеза кода. SemFix[14] использует компонентный синтез[16]. Dynamoth использует динамический синтез[17]. S3[18] опирается на синтаксически управляемый синтез кода[19]. SearchRepair[20] конвертирует потенциальные патчи в SMT-формулы и ищет такие варианты, для которых исправленная программа проходит все тесты.
На основе данных (data-driven)
Методы машинного обучения могут повышать эффективность автоматического исправления ошибок[7] Примером является подход, обучающийся на исправлениях, сделанных разработчиками (несколько сотен тысяч патчей из GitHub и SourceForge), и использующий полученные знания для распознавания и ранжирования потенциально верных патчей среди всех сгенерированных.[7] Альтернативой является майнинг патчей из других проектов (доноров) или Q&A-сайтов.[21].
Getafix[22] — язык-независимая система, применяемая в Facebook: она извлекает характерные паттерны исправлений по примерам коммитов и затем использует их для аналогичных багов в будущем, предлагая наиболее релевантное решение для последующей проверки.
Исправление по шаблонам
Для отдельных классов ошибок (например, утечек памяти, null pointer exception и др.) применяются специализированные шаблоны исправления:
- устранение null pointer exception путём проверки переменной на null[23];[13][24]
- устранение целочисленного переполнения
- устранение переполнения буфера
- устранение утечек памяти с автоматической вставкой освобождения памяти[25];
По сравнению с generate-and-validate, шаблонные методы обеспечивают более высокую точность для своей области, но сильно ограничены по классу ошибок[6][25].
Применение
Схемы использования автоматического исправления ошибок:
- В процессе разработки: разработчик по мере обнаружения ошибки инициирует автоматический поиск патча (например, нажатием кнопки в среде разработки). Поиск может проходить на фоне, если IDE сама анализирует проект на потенциальные проблемы[26].
- В режиме исполнения: при отказе во время работы возможно динамическое создание и подмена бинарного патча (on-line). Пример: система ClearView[27] для on-the-fly исправления x86-кода.
Пространство поиска
Фактически автоматическое исправление ошибок — это задача поиска, основанная на дедукции либо эвристиках. Пространство поиска состоит из всех допустимых изменений исходной программы. Исследования показывают, что исходная функция пригодности системы GenProg не лучше случайного поиска, а корректные патчи встречаются очень редко относительно некорректных (см. также раздел о переобучении ниже)[28].
Переобучение (overfitting)
В тест-ориентированном исправлении часто возникают патчи, проходящие тесты, но некорректные на недостающем покрытии; это называют переобучением (overfitting)[29]. Под этим понимается слишком точная подгонка патча под тестовые входы. Возможные проявления переобучения — частичное исправление (fixed только часть дефектных входов), либо внесение новых регрессий. В ранних прототипах переобучение было широко распространено: например, на ManyBugs у GenProg 104 из 110 сгенерированных патчей оказались переобученными[6] Для методов синтеза кода этот процент может превышать 80 %.[30].
Одним из путей борьбы с переобучением служит дополнительная фильтрация патчей — например, с помощью динамического анализа[31]. Альтернативные методы основываются на эвристиках или представлениях изменений кода[32].[33]
Ограничения автоматического исправления ошибок
Методы, опирающиеся только на тест-наборы, не обеспечивают гарантии корректности патчей, так как тесты зачастую неполны[6] Слабые тест-наборы могут приводить к появлению «валидных» (тест-проходящих), но некорректных патчей с удалением важных функций, утечками памяти, появлением новых уязвимостей.[6] Для уменьшения трудоёмкости квалификации тестов может применяться автоматическое построение тестовых оракулов, постепенно обучаемых на новых кейсах.[34].
Другим важным ограничением generate-and-validate является «взрыв» пространства поиска: количество инструкций и вариантов изменений настолько велико, что только гипотеза о малых изменениях позволяет значительно сокращать пространство перебора[35].
Недостатком символических методов[14][15] является резкое увеличение размера формул для реальных программ, особенно при необходимости изменения операторов с побочными эффектами.
Бенчмарки
Бенчмарки для автоматического исправления обычно ориентированы на конкретный язык программирования. В C основной набор — ManyBugs (69 реальных ошибок, собрано командой GenProg), который широко используется для сравнения средств для C[11].[7][10][15]
В Java стандартным эталоном является Defects4J, на котором строится большинство современых исследований исправления ошибок для Java[36].[37] Среди других бенчмарков — QuixBugs[38] (содержит «оригинальные» ошибки для задач восстановления), а также Bugs.jar[39], на основе коммитов.
Примеры инструментов
Автоматическое исправление ошибок активно исследуется в программной инженерии, разработано множество инструментов для C и Java (большинство носит исследовательский или экспериментальный характер).
C
- ClearView:[27] Инструмент для генерации бинарных патчей для развёрнутых приложений, проходят оценку на 10 случаях уязвимостей. В последующем исследовании по крайней мере для 4 из них были получены корректные патчи[6]
- GenProg:[5][11]. Базовый инструмент класса generate-and-validate, широко используется на ManyBugs.
- SemFix:[14] Первый программный инструмент для исправления багов в C на основе решателей.
- CodePhage: Первый инструмент, самостоятельно переносящий фрагменты кода между программами (может извлекать фрагменты даже из бинарных исполняемых файлов).
- LeakFix:[25] Средство для автоматического исправления утечек памяти в C-программах.
- Prophet:[7] Первая система этого класса, использующая обучение на человеческих патчах. Для 18 из 69 случаев производит патч, эквивалентный ручному исправлению[7]
- SearchRepair:[20]. Заменяет ошибочный код с помощью корректных примеров из других частей ПО. На наборе IntroClass качество патчей превышает решения GenProg, RSRepair и др[40].
- Angelix:[15] Улучшенный инструмент класса решателей; на GenProg-наборе для 10 случаев патчи эквивалентны человеческим.
- Learn2Fix:[34] Первый человек-в-петле (human-in-the-loop) полуавтоматический инструмент: систематически опрашивает пользователя для уточнения ошибок; работает с программами на целых числах.
Java
- PAR:[13] Инструмент generate-and-validate с использованием набора ручных шаблонов исправлений.
- QACrashFix:[21] — фиксирует Java-ошибки аварийных завершений через майнинг исправлений на Q&A сайтах.
- ARJA:[41] — многоцелевая система исправления Java на основе генетического программирования.
- NpeFix:[42] — автогенерация патчей для NullPointerException в Java (GitHub).
Другие языки
Проприетарные решения
Примечания
- ↑ Rinard, Martin C. (2008). “Technical perspective Patching program errors”. Communications of the ACM [англ.]. 51 (12): 86. DOI:10.1145/1409360.1409381. S2CID 28629846. Дата обращения 2024-06-27.
|access-date=требует|url=(справка) - ↑ Harman, Mark (2010). “Automated patching techniques”. Communications of the ACM [англ.]. 53 (5): 108. DOI:10.1145/1735223.1735248. S2CID 9729944. Дата обращения 2024-06-27.
|access-date=требует|url=(справка) - ↑ 1 2 Gazzola, Luca; Micucci, Daniela; Mariani, Leonardo (2019). “Automatic Software Repair: A Survey” (PDF). IEEE Transactions on Software Engineering [англ.]. 45 (1): 34—67. DOI:10.1109/TSE.2017.2755013. HDL:10281/184798. S2CID 57764123. Дата обращения 2024-06-27.
- ↑ Tan, Shin Hwei. relifix: Automated repair of software regressions // 2015 IEEE/ACM 37th IEEE International Conference on Software Engineering / Shin Hwei Tan, Abhik Roychoudhury. — IEEE, 2015. — P. 471–482. — ISBN 978-1-4799-1934-5. — doi:10.1109/ICSE.2015.65.
- ↑ 1 2 3 4 5 6 Weimer, Westley. Automatically finding patches using genetic programming // Proceedings of the 31st International Conference on Software Engineering / Westley Weimer, ThanhVu Nguyen, Claire Le Goues … [и др.]. — IEEE, 2009. — P. 364–374. — ISBN 978-1-4244-3453-4. — doi:10.1109/ICSE.2009.5070536.
- ↑ 1 2 3 4 5 6 7 8 Qi, Zichao. An Analysis of Patch Plausibility and Correctness for Generate-and-Validate Patch Generation Systems // Proceedings of the 2015 International Symposium on Software Testing and Analysis / Zichao Qi, Fan Long, Sara Achour … [и др.]. — ACM, 2015. — ISBN 978-1-4503-3620-8. — doi:10.1145/2771783.2771791.
- ↑ 1 2 3 4 5 6 7 8 Long, Fan. Automatic patch generation by learning correct code // Proceedings of the 43rd Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages / Fan Long, Martin Rinard. — ACM, 2016. — P. 298–312. — ISBN 978-1-4503-3549-2. — doi:10.1145/2837614.2837617.
- ↑ 1 2 Pei, Yu; Furia, Carlo A.; Nordio, Martin; Wei, Yi; Meyer, Bertrand; Zeller, Andreas (май 2014). “Automated Fixing of Programs with Contracts”. IEEE Transactions on Software Engineering. 40 (5): 427—449. arXiv:1403.1117. Bibcode:2014arXiv1403.1117P. DOI:10.1109/TSE.2014.2312918. S2CID 53302638. Дата обращения 2024-06-27. Проверьте дату в
|date=(справка на английском);|access-date=требует|url=(справка) - ↑ Qi, Yuhua. The Strength of Random Search on Automated Program Repair // Proceedings of the 36th International Conference on Software Engineering / Yuhua Qi, Xiaoguang Mao, Yan Lei … [и др.]. — Остин, Техас : ACM, 2014. — P. 254–265. — ISBN 978-1-4503-2756-5. — doi:10.1145/2568225.2568254.
- ↑ 1 2 3 Long, Fan. Staged Program Repair with Condition Synthesis // Proceedings of the 2015 10th Joint Meeting on Foundations of Software Engineering / Fan Long, Martin Rinard. — Бергамо, Италия : ACM, 2015. — P. 166–178. — ISBN 978-1-4503-3675-8. — doi:10.1145/2786805.2786811.
- ↑ 1 2 3 Le Goues, Claire. A Systematic Study of Automated Program Repair: Fixing 55 out of 105 Bugs for $8 Each // 2012 34th International Conference on Software Engineering (ICSE) / Claire Le Goues, Michael Dewey-Vogt, Stephanie Forrest … [и др.]. — IEEE, 2012. — P. 3–13. — ISBN 978-1-4673-1067-3. — doi:10.1109/ICSE.2012.6227211.
- ↑ Qi, Zichao. An analysis of patch plausibility and correctness for generate-and-validate patch generation systems // Proceedings of the 2015 International Symposium on Software Testing and Analysis / Zichao Qi, Fan Long, Sara Achour … [и др.]. — Нью-Йорк : ACM, 2015-07-13. — P. 24–36. — ISBN 9781450336208. — doi:10.1145/2771783.2771791.
- ↑ 1 2 3 Kim, Dongsun. Automatic Patch Generation Learned from Human-written Patches // Proceedings of the 2013 International Conference on Software Engineering / Dongsun Kim, Jaechang Nam, Jaewoo Song … [и др.]. — IEEE Press, 2013. — P. 802–811. — ISBN 978-1-4673-3076-3.
- ↑ 1 2 3 4 Nguyen, Hoang Duong Thien. SemFix: Program Repair via Semantic Analysis // Proceedings of the 2013 International Conference on Software Engineering / Hoang Duong Thien Nguyen, Dawei Qi, Abhik Roychoudhury … [и др.]. — Сан-Франциско : IEEE Press, 2013. — P. 772–781. — ISBN 978-1-4673-3076-3.
- ↑ 1 2 3 4 Mechtaev, Sergey. Angelix: scalable multiline program patch synthesis via symbolic analysis // Proceedings of the 38th International Conference on Software Engineering, ICSE 2016, Austin, Texas, May 14-22, 2016 / Sergey Mechtaev, Jooyong Yi, Abhik Roychoudhury. — 2016. — P. 691–701.
- ↑ Jha, Susmit. Oracle-guided component-based program synthesis / Susmit Jha, Sumit Gulwani, Sanjit A. Seshia … [и др.]. — ACM, 2010-05-01. — P. 215–224. — ISBN 9781605587196. — doi:10.1145/1806799.1806833.
- ↑ Galenson, Joel. CodeHint: dynamic and interactive synthesis of code snippets / Joel Galenson, Philip Reames, Rastislav Bodik … [и др.]. — ACM, 2014-05-31. — P. 653–663. — ISBN 9781450327565. — doi:10.1145/2568225.2568250.
- ↑ Le, Xuan-Bach D. Proceedings of the 2017 11th Joint Meeting on Foundations of Software Engineering - ESEC/FSE 2017 / Xuan-Bach D. Le, Duc-Hiep Chu, David Lo … [и др.]. — ACM, 2017-08-21. — P. 593–604. — ISBN 9781450351058. — doi:10.1145/3106237.3106309.
- ↑ Alur, Rajeev. Syntax-guided synthesis // 2013 Formal Methods in Computer-Aided Design / Rajeev Alur, Rastislav Bodik, Garvit Juniwal … [и др.]. — 2013. — P. 1–8. — ISBN 9780983567837. — doi:10.1109/fmcad.2013.6679385.
- ↑ 1 2 Ke, Yalin. Repairing Programs with Semantic Code Search // Proceedings of the 2015 30th IEEE/ACM International Conference on Automated Software Engineering / Yalin Ke, Kathryn Stolee, Claire Le Goues … [и др.]. — Линкольн, Небраска : ACM, 2015. — P. 295–306. — ISBN 978-1-5090-0025-8. — doi:10.1109/ASE.2015.60.
- ↑ 1 2 Gao, Qing. Fixing Recurring Crash Bugs via Analyzing Q&A Sites // 2015 30th IEEE/ACM International Conference on Automated Software Engineering (ASE) / Qing Gao, Hansheng Zhang, Jie Wang … [и др.]. — IEEE, 2015. — P. 307–318. — ISBN 978-1-5090-0025-8. — doi:10.1109/ASE.2015.81.
- ↑ 1 2 Bader, Johannes; Scott, Andrew; Pradel, Michael; Chandra, Satish (10 октября 2019). “Getafix: learning to fix bugs automatically”. Proceedings of the ACM on Programming Languages. 3 (OOPSLA): 159:1–159:27. arXiv:1902.06111. DOI:10.1145/3360585. Дата обращения 2024-06-27.
|access-date=требует|url=(справка) - ↑ Long, Fan. Automatic Runtime Error Repair and Containment via Recovery Shepherding // Proceedings of the 35th ACM SIGPLAN Conference on Programming Language Design and Implementation / Fan Long, Stelios Sidiroglou-Douskos, Martin Rinard. — Нью-Йорк : ACM, 2014. — P. 227–238. — ISBN 978-1-4503-2784-8. — doi:10.1145/2594291.2594337.
- ↑ Dobolyi, Kinga. Changing Java's Semantics for Handling Null Pointer Exceptions // 2008 19th International Symposium on Software Reliability Engineering (ISSRE) / Kinga Dobolyi, Westley Weimer. — 2008. — P. 47–56. — doi:10.1109/ISSRE.2008.59.
- ↑ 1 2 3 Gao, Qing. Safe Memory-leak Fixing for C Programs // Proceedings of the 37th International Conference on Software Engineering – Volume 1 / Qing Gao, Yingfei Xiong, Yaqing Mi … [и др.]. — Пискатауэй, Нью-Джерси : IEEE Press, 2015. — P. 459–470. — ISBN 978-1-4799-1934-5.
- ↑ Muşlu, Kıvanç; Brun, Yuriy; Holmes, Reid; Ernst, Michael D.; Notkin, David (19 октября 2012). “Speculative analysis of integrated development environment recommendations”. ACM SIGPLAN Notices. 47 (10): 669—682. DOI:10.1145/2384616.2384665. ISSN 0362-1340. S2CID 5795141. Дата обращения 2024-06-27.
|access-date=требует|url=(справка) - ↑ 1 2 Perkins, Jeff H. Automatically patching errors in deployed software // Proceedings of the ACM SIGOPS 22nd symposium on Operating systems principles. — ACM, 2009. — P. 87–102. — ISBN 978-1-60558-752-3. — doi:10.1145/1629575.1629585.
- ↑ Qi, Yuhua. The strength of random search on automated program repair / Yuhua Qi, Xiaoguang Mao, Yan Lei … [и др.]. — ACM, 2014-05-31. — P. 254–265. — ISBN 9781450327565. — doi:10.1145/2568225.2568254.
- ↑ Smith, Edward K. Is the Cure Worse Than the Disease? Overfitting in Automated Program Repair // Proceedings of the 2015 10th Joint Meeting on Foundations of Software Engineering / Edward K. Smith, Earl T. Barr, Claire Le Goues … [и др.]. — Нью-Йорк : ACM, 2015. — P. 532–543. — ISBN 978-1-4503-3675-8. — doi:10.1145/2786805.2786825.
- ↑ Le, Xuan Bach D.; Thung, Ferdian; Lo, David; Goues, Claire Le (2 марта 2018). “Overfitting in semantics-based automated program repair”. Empirical Software Engineering [англ.]. 23 (5): 3007—3033. DOI:10.1007/s10664-017-9577-2. ISSN 1382-3256. S2CID 3635768. Дата обращения 2024-06-27.
- ↑ Xin, Qi. Identifying test-suite-overfitted patches through test case generation // Proceedings of the 26th ACM SIGSOFT International Symposium on Software Testing and Analysis / Qi Xin, Steven P. Reiss. — Нью-Йорк : ACM, 2017-07-10. — P. 226–236. — ISBN 978-1-4503-5076-1. — doi:10.1145/3092703.3092718.
- ↑ Evaluating representation learning of code changes for predicting patch correctness in program repair, Proceedings of the 35th IEEE/ACM International Conference on Automated Software Engineering, Association for Computing Machinery (27 января 2021), С. 981–992. Дата обращения: 27 июня 2024.
- ↑ Tian, Haoye. Is this Change the Answer to that Problem?: Correlating Descriptions of Bug and Code Changes for Evaluating Patch Correctness // Proceedings of the 37th IEEE/ACM International Conference on Automated Software Engineering / Haoye Tian, Xunzhu Tang, Andrew Habib … [и др.]. — Association for Computing Machinery, 5 января 2023. — P. 1–13. — ISBN 9781450394758. — doi:10.1145/3551349.3556914.
- ↑ 1 2 Böhme, Marcel. Human-In-The-Loop Automatic Program Repair // Proceedings of the 13th International Conference on Software Testing, Validation and Verification / Marcel Böhme, Charaka Geethal, Van-Thuan Pham. — Порту, Португалия : IEEE, 2020. — P. 274–285. — ISBN 978-1-7281-5778-8. — doi:10.1109/ICST46399.2020.00036.
- ↑ Long, Fan. An Analysis of the Search Spaces for Generate and Validate Patch Generation Systems // Proceedings of the 38th International Conference on Software Engineering / Fan Long, Martin Rinard. — Нью-Йорк : ACM, 2016. — P. 702–713. — ISBN 978-1-4503-3900-1. — doi:10.1145/2884781.2884872.
- ↑ Wen, Ming. Context-aware patch generation for better automated program repair // Proceedings of the 40th International Conference on Software Engineering / Ming Wen, Junjie Chen, Rongxin Wu … [и др.]. — Нью-Йорк, США : ACM Press, 2018. — P. 1–11. — ISBN 9781450356381. — doi:10.1145/3180155.3180233.
- ↑ Hua, Jinru. Towards practical program repair with on-demand candidate generation // Proceedings of the 40th International Conference on Software Engineering / Jinru Hua, Mengshi Zhang, Kaiyuan Wang … [и др.]. — Нью-Йорк, США : ACM Press, 2018. — P. 12–23. — ISBN 9781450356381. — doi:10.1145/3180155.3180245.
- ↑ Lin, Derrick. QuixBugs: A multi-lingual program repair benchmark set based on the quixey challenge // Proceedings Companion of the 2017 ACM SIGPLAN International Conference on Systems, Programming, Languages, and Applications: Software for Humanity / Derrick Lin, James Koppel, Angela Chen … [и др.]. — Нью-Йорк : ACM Press, 2017. — P. 55–56. — ISBN 9781450355148. — doi:10.1145/3135932.3135941.
- ↑ Saha, Ripon K. Bugs.jar // Proceedings of the 15th International Conference on Mining Software Repositories : [англ.] / Ripon K. Saha, Yingjun Lyu, Wing Lam … [et al.]. — 2018. — P. 10–13. — ISBN 9781450357166. — doi:10.1145/3196398.3196473.
- ↑ Le Goues, Claire; Holtschulte, Neal; Smith, Edward; Brun, Yuriy; Devanbu, Premkumar; Forrest, Stephanie; Weimer, Westley (2015). “The Many Bugs and Intro Class Benchmarks for Automated Repair of C Programs”. IEEE Transactions on Software Engineering. 41 (12): 1236—1256. DOI:10.1109/TSE.2015.2454513. Дата обращения 2024-06-27.
|access-date=требует|url=(справка) - ↑ Yuan, Yuan; Banzhaf, Wolfgang (2020). “ARJA: Automated Repair of Java Programs via Multi-Objective Genetic Programming”. IEEE Transactions on Software Engineering. 46 (10): 1040—1067. arXiv:1712.07804. DOI:10.1109/TSE.2018.2874648. S2CID 25222219. Дата обращения 2024-06-27.
- ↑ Durieux, Thomas. Dynamic Patch Generation for Null Pointer Exceptions Using Metaprogramming // 2017 IEEE 24th International Conference on Software Analysis, Evolution and Reengineering (SANER). — 2017. — P. 349–358. — ISBN 978-1-5090-5501-2. — doi:10.1109/SANER.2017.7884635.
- ↑ AI is coming for your coding job (англ.). Sifted (13 марта 2019). Дата обращения: 27 июня 2024.
- ↑ Ishraq Khan, Revolutionizing the Programming Scene in 2021 (англ.). TechTimes (13 сентября 2019). Дата обращения: 27 июня 2024.