内容提要
Android 17 部分9月构建的 Bionic C 库存在宽字符处理缺陷:wcscspn() 和 wcspbrk() 在遇到 U+0100 及以上字符时,若匹配集包含两个以上低码位字符,会误判并提前终止扫描,影响 Emoji 和中文处理。由于公开源码与设备二进制实现不一致,开发者只能通过反汇编定位问题,而谷歌源码推送延迟进一步增加了排查难度。
延伸解读
宽字符处理缺陷的触发条件
根据文章,该缺陷在待扫描字符串包含 U+0100 及以上字符,且匹配集包含至少两个低于 U+0100 的字符时触发。此时 wcscspn() 和 wcspbrk() 会将非 ASCII 字符误判为匹配项并提前返回。这意味着程序在扫描换行符或通配符时,可能因遇到 Emoji 或中文字符而提前终止,忽略后续实际分隔符,影响字符串处理的正确性。
公开源码与设备二进制不一致的排查困境
文章指出,2026 年 6 月公开的 Android 17 源代码采用不同实现,无法复现问题,而 9 月更新设备上的 libc.so 包含不同处理逻辑。因此开发者无法依赖公开源码定位错误,只能反汇编设备二进制文件。这种不一致直接增加了排查难度,也解释了为何问题需要更长时间才能被确认和反馈。
AOSP 推送延迟对社区排查的影响
安卓维护者确认,Android 17 公开源代码位于 android17-release 分支,但该分支与受影响的 9 月设备构建实现方式不同。谷歌向 AOSP 推送源代码变更的延迟,导致社区开发者无法及时获取与设备一致的代码,只能通过反汇编等更底层手段定位问题。这凸显了源码同步时效性对第三方开发者排查系统缺陷的重要性。
Q&A
Android 17 的 Bionic C 库存在什么宽字符处理缺陷?
Bionic C 库中的 wcscspn() 和 wcspbrk() 函数在遇到 U+0100 及以上字符时,如果匹配集包含至少两个都低于 U+0100 的字符,会误判并提前终止扫描,影响 Emoji 和中文等非 ASCII 字符的处理。
这个宽字符处理错误在什么条件下会被触发?
当待扫描字符串含有 U+0100 及以上字符,且用于匹配的字符集包含至少两个、且都低于 U+0100 的字符时,相关函数会把遇到的非 ASCII 字符误当做匹配项而提前返回。
哪些设备或构建版本受到了这个宽字符处理错误的影响?
该问题在运行 Android 17 Build CP3A.260905.009 的 Pixel 7 和 Pixel 8a 上被复现,属于部分 9 月版本构建。
为什么开发者需要反汇编设备文件来定位这个错误?
因为谷歌公开的 Android 17 源代码(android17-release 分支)与受影响设备上实际使用的 libc.so 二进制实现不同,公开源码无法复现问题,所以开发者只能反汇编设备二进制文件来定位错误逻辑。
AOSP 源代码发布推迟对开发者排查问题造成了什么影响?
谷歌向 AOSP 推送源代码变更的延迟,导致社区开发者无法及时获取与设备构建一致的源码,增加了定位和反馈问题的难度,迫使开发者通过反汇编来排查。
这个宽字符处理错误是否已被官方确认?在哪里可以找到相关记录?
该问题已在 Android NDK 问题跟踪器中得到维护者确认,具体记录为 Android NDK Issue #2260。