2026.06.30 —— 今日 10 則
TODAY'S THREAD 今天的主線是「安全這件事得從邊界算起」——SQLite 逐一列出磁碟怎麼騙你、Fil-C 讓 setjmp/longjmp 記憶體安全、Ante 用形狀穩定把借用和引用計數揉在一起,而一個 V8 漏洞同時穿透 renderer 與 sandbox 兩層防線。
逆向工程 Apple Neural Engine
一篇論文靠直接量測與靜態分析,把 A11 到 A18、M1 到 M5 上那顆 Apple Neural Engine 拆給你看:資料路徑、限制吞吐的 roofline、權重壓縮方案,還有一條藏在 Core ML 底下、能從 user space 直接呼叫的派工路徑。Core ML 仍是官方介面,但作者證明研究者可以繞到更低層去量測與做裝置端研究。代價是這條路沒有支援、還會隨版本變動。
非同步預訓練的梯度延遲,其實不是問題
一篇 arXiv 論文挑戰「非同步 pipeline 並行會因梯度過時而不穩」的常識,結論是掉不掉分很看你用哪個 optimizer——Muon 對一步延遲的容忍度遠比 AdamW 好。作者在最大到 100 億參數的模型上驗證,加上一個 error-feedback 修正機制與收斂保證,讓非同步排程追平同步訓練的品質。省下的正是同步訓練被 pipeline bubble 浪費掉的算力。
讓 setjmp/longjmp 記憶體安全
Fil-C 是一個有記憶體安全的 C/C++ 編譯器,它把 setjmp/longjmp 與 ucontext 這些最容易搞出懸空堆疊的 API 全部變安全。做法是把 jmp_buf 和 ucontext_t 換成指向 runtime 內部物件的不透明指標,各自跑一套狀態機——longjmp 只允許從 setjmp 所在的後代堆疊框呼叫,否則直接 panic。ucontext 這組(v0.680 起)則配一條由 runtime 管理的堆疊、追蹤 fiber 狀態並綁定執行緒,讓 coroutine 不可能跑在已釋放的堆疊上。
Ante:把借用檢查和引用計數揉在一起
Ante 這個語言想同時要到借用檢查的零成本與引用計數的彈性,靠的是「形狀穩定」——改一個 struct 的欄位不會讓指向它欄位的參照失效。關鍵手法是暫時的 uniq 轉換:當編譯器能證明作用域裡沒有別的變數會別名到同一份資料,就把一個共享可變的 RC 參照臨時借成獨占參照。這樣就能改共享可變資料的欄位,卻不用背 Rust 的 Rc<RefCell> 那種執行期崩潰風險。
WATaBoy:把 Game Boy 指令 JIT 成 Wasm
WATaBoy 是一個 Game Boy 模擬器,它不直譯指令,而是在執行期把 Game Boy 機器碼翻成 WebAssembly,再交給瀏覽器的 JS 引擎優化成原生碼。它用 basic block 翻譯,把不含分支的指令湊成一段一起編。跑 Pokémon Blue 時,這條多繞一層的路反而比原生直譯快約 1.2 倍、比自家的 Wasm 直譯器快約 1.5 倍。
HBM 不是你需要的全部:拆開 LLM serving
一篇 arXiv 論文提出 HMA-Serve:把 LLM 推論的兩個階段拆到不同記憶體的加速器上——用 GDDR 卡跑 prefill、HBM GPU 跑 decode,各自吃它擅長的那一段。搭配 prefill 階段用 vendor 原生低精度量化(decode 維持 BF16)、把 KV cache 搬運跟 prefill 疊在一起的 pipeline,還有延後 dequantize 來省頻寬。在 Qwen3 的 4B 到 32B 上,goodput 最高比記憶體同質的做法高 3.2 倍、每塊錢的 goodput 高 4.8 倍,等於把昂貴 HBM 從最吃算力的 prefill 階段拿掉。
一個漏洞同時穿透 Chrome 兩層防線
CVE-2026-6307 的 write-up 展示一件安全模型上很尷尬的事:同一個 V8 漏洞可以一口氣穿過兩道邊界——先拿下 renderer,再逃出 V8 sandbox。V8 sandbox 本來的設計前提,就是即使 renderer 被攻陷,攻擊者仍被關在裡面;這個 bug 讓那個假設破功。作者把整條利用鏈完整攤開,是理解現代瀏覽器縱深防禦哪裡會斷的好教材。
你可能不需要 service worker
Jay Freestone 主張 service worker 早年被吹得太神,如今多數用途都有更好的做法。資產快取交給帶 content hash 的 HTTP 快取加 immutable 標頭就夠;跨部署的舊資產靠 storage bucket 留一段緩衝期,Vercel 的 skew protection 證明這放伺服器端更穩;manifest 改寫該搬到邊緣(例如 Cloudflare Workers)。他也承認離線支援、推播與背景同步這三項,目前仍沒有真正的替代品。
如何弄壞一個 SQLite 資料庫檔
SQLite 官方這份文件反過來教你:一個應用程式有幾種方式可以把資料庫檔弄壞。崩潰後刪掉 hot journal,自動修復就失效、資料庫可能損毀;網路檔案系統(尤其 NFS)的鎖常常名不副實;close() 會取消整個行程對同一檔案的所有 POSIX advisory lock。而最陰險的一條是消費級磁碟「會謊報已同步」——資料還在 track buffer 就回報寫入完成,斷電就是亂序寫入加損毀。
愈來愈多公共 DNS 不再收 53/UDP
一份對公共 DNS resolver 的整理實測發現:不少服務已經不走傳統的 53/UDP。像 Mullvad 的 DNS,直接 dig 查不到答案,得加上 +https 走 DoH 或 +tls 走 DoT 才通。對習慣直接把某個 DNS 位址填進設定、預設它收 UDP 查詢的人,這份清單值得先對一遍再抄。