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». Обход сделан заменой вызовов на обычные циклы.