11 октября, в выходные перед Linux 7.3-rc7, в дереве Линуса Торвальдса появился тег assoc-array-fixes. История простая и показательная: Нильс Оллрогге прислал баг в библиотеке assoc_array вместе с патчем, а Линус честно признался, что код слишком запутанный, чтобы в нём разобраться. Поэтому он сделал то, что сам советует другим: взял LLM и с её помощью переписал код так, чтобы его можно было читать.
Что написал Линус
В описании тега Линус говорит прямо: «сделал то, что проповедую», то есть использовал современные LLM, чтобы понять чужой код. Получилась ветка, где крупные и трудночитаемые функции порезаны на куски поменьше. Потом код прогнали через тестовый стенд в пространстве пользователя, и он не только подтвердил баг Нильса, но и нашёл ещё три. Все четыре живут с самого первого коммита библиотеки в 2013 году.
Что такое assoc_array и что в ветке
assoc_array это обобщённый ассоциативный массив ядра, дерево из узлов и «ярлыков» (shortcut), которые позволяют пропускать длинные общие префиксы ключей. Им пользуется, например, подсистема ключей (keyrings). Код написан в 2013 году, полон goto и меток, и разбираться в нём больно, что Линус и подтвердил.
В ветке 15 коммитов. Большая часть это чистый рефакторинг: вставка, разделение узла, создание ярлыка, сборка мусора и удаление вынесены в отдельные функции, метки заменены циклами. Четыре коммита чинят баги, у каждого стоят строки Fixes на исходный коммит 3cb989501c26 «Add a generic associative array implementation.» и Assisted-by: LLM.
Четыре бага
Баг Нильса: новый ярлык мог прицепиться к уже существующему, и получался ярлык, ведущий на ярлык. Такого не ждёт никто: обход дерева принимает второй ярлык за узел, а применение правки упирается в BUG_ON(). Хватало восемнадцати вставок и одного удаления с ключами, у которых длинный общий префикс.
Три бага нашли тесты. Первый: при разрезании ярлыка ровно на границе машинного слова маска обнулялась целиком, и объекты под ярлыком переставали находиться. В тесте 102-й ключ разрезал ярлык на 256-м бите, и пропали 76 ключей, а AddressSanitizer заодно поймал чтение за концом массива. Второй: ярлык в корне, разрезанный на уровне 4, давал корень с неправильной индексацией, из восемнадцати объектов три терялись, а повторная вставка такого ключа создавала дубль. Третий: если при сборке мусора не хватало памяти, очистка нового дерева уходила по указателю в старое и срабатывал BUG_ON().
Почему это интересно
Это не «ИИ написал за Линуса патч». LLM здесь работала как помощник для чтения старого кода: разложить функции, написать стенд в userspace, перебрать уровни разрезания и отказы выделения памяти. Каждый баг описан в коммите конкретно, с минимальным воспроизведением, а подписывает всё Линус. Тринадцать лет код жил с ошибками, которые проявляются на редких наборах ключей, и вылезли они только когда его наконец стало можно читать и тестировать.
По данным Phoronix, в тот же день у Линуса появилась и ветка noref-filemap-read-with-llm, где он с Claude Code готовил улучшение ввода-вывода. В основную ветку assoc-array-fixes пока не влили, скорее всего она пойдёт в окно слияния Linux 7.4.