일간
Android 17 QPR1의 libc 회귀 — 소스가 없어 디스어셈블로 찾았다
이 소식의 앞선 글 · Android 17 QPR1, AOSP 없이 새 API를 넣었다 — Honeycomb 이후 처음 (2026년 9월 18일)
android/ndk 이슈 #2260, 10월 12일입니다. 제목은 "bionic: wcscspn()/wcspbrk()가 wchar_t ≥ 0x100을 전부 일치로 처리 (Android 17, CP3A.260905.009)".
버그
wcscspn(s, reject)은 s에서 reject 집합의 문자가 처음 나오는 위치까지의 길이를 돌려주는 와이드 문자열 함수입니다. 9월 빌드 Android 17에서 이 함수가 U+0100 이상의 문자를 집합에 없어도 일치로 처리합니다. 한글, 한자, 이모지가 전부 해당합니다. 거부 집합이 U+0100 미만 문자 2개 이상일 때만 발생하고, wcspbrk()는 wcscspn()을 호출하므로 같이 깨집니다. wcsspn, wcschr, wcsstr 등은 정상입니다.
보고자가 든 실제 영향은 Visual Pinball의 VBScript 렉서와 FileSystem.MoveFolder입니다. 영어 외 문자가 들어간 문자열을 토큰화하는 코드는 어디든 걸릴 수 있습니다.
어떻게 찾았나
보고자는 배포된 libc.so를 디스어셈블했습니다. 집합 크기에 따라 세 경로가 선택되고, 세 번째 경로에서 U+0100 이상 문자를 만나면 스캔을 멈춥니다. 6월에 공개된 android17-release 소스에서는 이 동작이 없어, 9월 빌드에서 생긴 회귀로 추정했습니다.
소스를 보지 못한 이유는 Android 17 QPR1 소스가 공개되지 않았기 때문입니다. 댓글 여러 개가 이 점을 지적했습니다. Android는 올해부터 QPR 소스를 분기마다가 아니라 다음 메이저 릴리스 때 몰아서 공개하는 체계로 바뀌었습니다.
Google의 답변
bionic 메인테이너 enh-google이 확인했습니다. "전부 맞고, ToT(최신 개발 버전)에도 여전히 문제가 있다." 누락된 테스트를 추가하고, 기존 wcscspn 테스트가 잘못된 기댓값을 갖고 있었다는 점을 인정했으며, 다른 libc에 대해서도 테스트를 돌려 잘못된 테스트가 들어가기 어렵게 하겠다고 했습니다. 영향 기기를 줄이기 위한 백포트를 검토하겠다고 했습니다.
글에 없는 것
수정 커밋, 백포트 완료 여부, 수정이 들어갈 빌드 번호는 없습니다. 왜 9월 빌드에서 바뀌었는지(최적화 경로 추가?)의 설명도 없습니다.
실무에서 할 일
NDK 코드에서 wcscspn/wcspbrk를 쓴다면 Android 17 9월 빌드 이후 기기에서 비ASCII 입력으로 테스트하세요. 우회는 직접 루프를 도는 것입니다 — 함수 자체가 단순해서 몇 줄입니다. 더 넓게는, 이 사례가 보여주는 것은 OS 업데이트 후 생긴 네이티브 버그를 소스 없이 추적해야 하는 기간이 이제 분기 단위로 생긴다는 점입니다. 9월 18일에 다룬 QPR1 API 변경과 같은 흐름입니다.
2026년 10월 14일에 올라온 글
그날 대시보드 →이날은 이 글 하나입니다.
댓글
불러오는 중…