Чтобы сообщить о баге в Android, разработчику пришлось дизассемблировать libc
Разработчик под ником francisdb обнаружил ошибку в стандартной библиотеке Android — bionic. В сентябрьских сборках Android 17 (CP3A.260905.009) функции wcscspn() и wcspbrk(), которые ищут в строке заданные символы, ведут себя неверно: любой символ с кодом не ниже U+0100 они принимают за совпадение, если искомый набор состоит из двух и более символов, и все они меньше 0x100.
На практике это ломает любой код, сканирующий широкие строки в поисках ASCII-разделителей — например, переводов строки или подстановочных знаков, — как только в тексте встречается эмодзи, иероглиф, кириллица, греческая буква или расширенная латиница. Пробег по всем кодовым точкам показал: ошибка затрагивает 1 111 808 символов, от U+0100 до U+10FFFF.
Пришлось читать машинный код
Самое любопытное в этой истории — не сам баг, а то, как его пришлось исследовать. Публичные исходники android17-release (сборка от июня 2026 года) содержат корректную версию функций из external/llvm-libc. Но на устройствах работает другой код, появившийся между июньским и сентябрьским релизами, и этих изменений в открытых источниках просто нет. Поэтому автору пришлось дизассемблировать libc.so прямо с устройства и по ассемблерным инструкциям восстанавливать, где именно цикл сканирования ошибочно останавливается на символе с кодом ≥ 0x100.
Сотрудник Google подтвердил проблему и честно признал неловкость ситуации: он хотел было посоветовать "просто посмотреть в исходники", но обнаружил, что открытая ветка слишком стара и нужных изменений в ней нет. Вдобавок выяснилось, что существующий тест для wcscspn() сам содержал ошибку и ожидал неверного результата.
Реальные последствия и общий вопрос
Из-за регрессии, в частности, перестал запускать таблицы Android-порт Visual Pinball: его движок VBScript через wcspbrk() искал конец строки в комментарии, но натыкался на эмодзи и выдавал "недопустимый символ". Проблему обошли, заменив вызовы обычными циклами.
Обсуждение быстро вышло за рамки одной функции. Участники напомнили, что после решения Google закрыть разработку AOSP накопилось множество issue без исправлений и без прозрачности. Прозвучал прямой вопрос: где исходники Android 17 QPR1 — той версии, что уже больше месяца стабильно работает на Pixel? Внятного ответа, кроме ссылки на официальную страницу об изменениях в AOSP, пока нет.
Источник: Hacker News
Комментарии
Войдите, чтобы комментировать.