Hacker News Digest

14 октября 2026 г. в 06:18 • github.com • ⭐ 365 • 💬 172

Original • HN

#android#android-17#bionic#github#issue#libc#llvm-libc#wchar

AOSP Source Releases Are So Late Developers Disassemble Libraries to Report Bugs

В Android 17 (сборки сентября 2026) функции wcscspn() и wcspbrk() из bionic ошибочно считают совпадением любой символ wchar_t начиная с U+0100, если набор отвергаемых символов состоит из двух и более знаков, все из которых меньше U+0100. Сканирование широких строк останавливается на первом эмодзи, иероглифе, кириллице или другом символе вне латиницы-1, хотя его нет в наборе. Остальные функции — wcsspn(), wcschr(), wcsrchr(), wmemchr(), wcsstr() — работают корректно.

Причина видна в дизассемблировании libc.so: для набора из двух и более символов строится 256-байтовая таблица, а затем цикл сканирования проверяет лишь младший байт и при c >= 0x100 безусловно останавливается, помечая символ как совпадение. Для wcsspn такая остановка верна, поэтому пострадали только дополняющие функции. Регрессия появилась между июньским и сентябрьским релизами: публичные исходники android-17.0.0_r1 используют корректный external/llvm-libc. Тест TEST(wchar, wcspbrk) проверяет лишь ASCII и баг не ловит.

На практике в Visual Pinball на Android перестали загружаться таблицы, где в комментариях VBScript есть эмодзи: лексер через wcspbrk(ptr, L"\n\r") получал позицию эмодзи вместо конца строки и сообщал «Invalid character». Обход сделан заменой вызовов на обычные циклы.