開發者 francisdb 於 2026 年 10 月 12 日在 GitHub 上回報,Android 17 的 bionic libc 中存在一個回歸錯誤,導致 `wcscspn()` 和 `wcspbrk()` 函數在處理寬字串時出現異常。具體而言,當拒絕集(reject set)包含兩個或以上全部小於 U+0100 的字元時,這兩個函數會錯誤地將任何大於或等於 U+0100 的字元視為匹配項並停止掃描,即使該字元並不在集合中;若拒絕集中包含至少一個大於或等於 U+0100 的字元,或拒絕集僅有一個字元,則行為正確。此錯誤僅影響 `wcscspn()` 和 `wcspbrk()`,而 `wcsspn()`、`wcschr()`、`wcsrchr()`、`wmemchr()` 和 `wcsstr()` 等其他函數行為正確。此錯誤影響 Pixel 7 和 Pixel 8a 裝置上的 Android 17 構建(版本 CP3A.260905.009),但不影響 Nothing Phone 2 上的 Android 16 構建。受影響的應用包括 Visual Pinball(因註解中的表情符號導致載入失敗)和檔案系統操作(將非 ASCII 路徑誤判為萬用字元模式)。Google 協作者 enh-google 確認問題存在於最新開發分支,並承諾修復錯誤測試及嘗試將修復回傳至舊版本。由於 AOSP 原始碼發布延遲,開發者不得不透過反組譯已發布的 `libc.so` 來定位問題機制。
事件背景
在 Android 17 的公開原始碼(android17-release 分支,2026 年 6 月發布)中,`wcscspn()` 和 `wcspbrk()` 從 `external/llvm-libc` 編譯,採用正確的巢狀迴圈實作。然而,2026 年 9 月的構建引入了不同的實作,透過反組譯發現其使用了一個 256 位元組的布林表格進行最佳化,但該實作在處理大於 U+0100 的字元時邏輯錯誤,導致掃描提前終止。Google 協作者指出,`android-latest-release` 是一個 manifest 分支,而 `android17-release` 是 git 分支,但實際運行於 Pixel 裝置上的 Android 17 QPR1 原始碼尚未公開,這使得開發者難以直接檢視源碼來除錯。此外,現有的 bionic 測試僅使用 ASCII 輸入,因此未能捕捉到此非 ASCII 字元的錯誤。
社群觀察
社群討論集中在對 AOSP 原始碼發布策略的批評。用戶 joaquinvacas 表示擔憂,認為 Google 關閉 AOSP 原始碼導致許多問題無法修復且缺乏透明度,並詢問專案管理是否有改進措施。Google 協作者 pirama-arumuga-nainar 回應指出,官方溝通可在 source.android.com 找到,並澄清了分支結構。用戶 zenczykowski 質疑為何實際運行於 Pixel 上的 Android 17 QPR1 原始碼未公開。其他評論包括對 Google 動機的諷刺(如 reddalo 稱「盡可能邪惡」)、對替代作業系統的需求(dethos 建議開發 SalfishOS 或 Ubuntu Touch 等),以及對 AI 輔助反組譯的討論(userbinator 提到 AI 開啟軟體源碼的好處,Retr0id 則認為若導致 AI 反組譯 AOSP 將很有趣)。另有用戶 kodebach 推測這部分歸因於歐盟法規的反效果,但未提供具體證據。



