後端工坊 2026 年 5 月 1 日

2026-05-01 — GCC 16.1 C++20 預設、Rust GSoC 2026 入選、TCMalloc rseq 衝突、ECH RFC 9849

GCC 16.1 發布:C++20 預設、C++26 反射/…

GCC 16.1 發布:C++20 預設、C++26 反射/合約、AMD Zen6 支援、HTML 診斷輸出

GCC Project · 2026-04-30

GCC 16.1 正式發布(最後修訂 2026-04-30),帶來多項對 C++ 工具鏈影響深遠的變更,包含預設語言標準提升、大量 C++26 特性實作,以及全新的診斷輸出格式。

預設 C++ 標準提升至 C++20

GCC 16 將 C++ 編譯的預設語言版本從 -std=gnu++17 提升至 -std=gnu++20。這是繼 GCC 6 將預設從 C++11 提升至 gnu++14 之後的重大里程碑。依賴 C++17 特性但未明確指定 -std 的專案在升級至 GCC 16 後可能需要調整。

C++26 特性

實驗性 C++26 支援新增多個重要特性:

  • 反射(Reflection):允許程式在編譯期檢視型別、函式、類別等語言元素的元資訊
  • 合約(Contracts)pre/post/assert 宣告式前後置條件與不變量
  • 改善的 C++20 模組支援:新增 --compile-std-module 選項,加速標準函式庫模組的獨立編譯
  • C++26 模板階層式錯誤訊息:為深層模板實例化提供更易讀的錯誤輸出

架構支援擴充

  • AMD Zen6 CPU 支援(-march=znver6
  • Intel Wildcat Lake 與 Nova Lake 處理器
  • LoongArch32 架構新增,包含 FMV(Function Multi-Versioning)支援
  • AMD GPU MI300 實驗性支援

診斷輸出新格式

GCC 16 引入 -fdiagnostics-add-output=experimental-html 旗標,可輸出 HTML 格式診斷報告,支援超連結跳轉至相關程式碼位置與文件。SARIF 輸出增強為有向圖支援,新增環境變數用於診斷日誌記錄。

向量化器改進

新增對非計數迴圈(uncounted loops)與提前中止(early break)的向量化最佳化,以及改進的 reduction 平行偵測。

其他語言支援

實驗性 Algol 68 編譯器(ga68)正式納入,Fortran 2023 三角函式等支援擴充。

原始來源:GCC 16 Release — Changes, New Features, and Fixes


Rust GSoC 2026:13 個專案入選,涵蓋 Wild Linker、自動微分 CI、GPU Offload 前端

Rust Blog · 2026-04-30

Rust 專案宣布 2026 年 Google Summer of Code 入選的 13 個專案,涵蓋工具鏈基礎設施、語言功能實作與生態系整合三大類別。

Wild Linker 相關(2 個專案)

  • Adding WebAssembly Linking Support to Wild(Kei Akiyama,Mentor: David Lattimore):為 Wild(純 Rust 編寫的鏈結器)新增 WebAssembly 目標的鏈結能力
  • Link Linux kernel and its Modules with Wild(Vishruth Thimmaiah,Mentor: David Lattimore):使 Wild 能夠鏈結 Linux 核心本體與可載入模組(.ko 檔),取代 binutils ld 在核心建置流程中的角色

GPU 與自動微分

  • A Frontend for Safe GPU Offloading in Rust(Marcelo Domínguez,Mentor: Manuel Drehwald):為安全的 GPU 卸載建立前端 API
  • Bringing autodiff and offload into Rust CI(Shota Sugano,Mentor: Manuel Drehwald):將自動微分(autodiff)與 GPU offload 功能整合入 Rust 持續整合管線

語言功能

  • Implementing impl and mut restrictions(Ryosuke Yamano):實作 Rust 型別系統中的 impl 與 mut 限制規則
  • Debugger for Miri(Mohamed Ali Mohamed,Mentor: Oli Scherer):為 Rust 的未定義行為偵測器 Miri 新增除錯器支援

工具與生態系

  • Migrating rust-analyzer assists to SyntaxEditor(Shourya Sharma):將 rust-analyzer 的程式碼輔助功能遷移至新的 SyntaxEditor API
  • Port std::arch test suite to rust-lang/rust(Sumit Kumas):將架構特定 SIMD 測試套件遷移至主倉庫
  • XDG path support for rustup(Guicheng Liu,Mentor: rami3l):讓 rustup 遵循 XDG Base Directory 規範管理設定檔
  • libc: transition differing bit-width time and offset variants(Adam Martinez,Mentor: Trevor Gross):解決 libc crate 中跨平台時間型別寬度不一致問題
  • Improving Ergonomics and Safety of serialport-rs(Tanmay):改善 serialport 函式庫的 API 安全性與易用性
  • Reorganizing tests/ui/issues(Matthew):重組測試套件目錄結構
  • Utilize debugger APIs to improve debug info accuracy(Anthony Bolden):利用除錯器 API 改善 DWARF 偵錯資訊的正確性

原始來源:Rust Blog — Announcing Google Summer of Code 2026 Selected Projects


TCMalloc 違反 rseq 文件 API:Linux 6.19 相容性破壞與 Hyrum 定律的核心教訓

LWN.net · 2026-04-30

LWN 的 Jonathan Corbet 在 2026 年 4 月 30 日報導了 Google 的 TCMalloc 記憶體配置器與 Linux 核心 restartable sequences(rseq)API 之間的相容性衝突,以及此事件對核心 API 設計的啟示。

Restartable Sequences(rseq)背景

rseq 是 Linux 5.1 引入的核心機制,允許使用者空間程式定義「可重新啟動的序列」——一段不能被中斷的程式碼,若被搶佔則由核心將 PC 重設至指定的 abort handler。這讓每 CPU 資料結構的操作能達到無鎖(lock-free)效能,TCMalloc 正是利用此機制加速記憶體配置。

衝突核心

TCMalloc 的實作依賴了 rseq API 的一個未記錄行為:在特定條件下,abort handler 的呼叫方式與文件規格不符(具體而言,rseq_cs 結構在 abort 時的狀態保留)。Linux 6.19 的一項核心內部重構符合文件規格,卻破壞了 TCMalloc 的實作假設。

Hyrum 定律的具體體現

Hyrum 定律(Hyrum's Law)指出:「當一個 API 有足夠多的使用者時,API 的所有可觀察行為都會被某人依賴,無論規格是否有此承諾。」此案例是核心 API 中的典型範例:TCMalloc 不是惡意濫用 API,而是在長期使用中「自然地」依賴了實作細節而非文件承諾。

解決方案

核心方面,維護者 Mathieu Desnoyers 提交了一個補丁以恢復舊行為。TCMalloc 方面,Google 工程師同步修正了實作以符合文件規格。此事件也觸發了對 rseq 文件本身的改善,將先前模糊的行為描述明確化。

原始來源:LWN.net — Restartable sequences, TCMalloc, and Hyrum's Law


ECH(RFC 9849)終於完成:加密 ClientHello 的部署挑戰與 Nginx 1.30 支援

Feisty Duck Newsletter · 2026-04-30

Encrypted Client Hello(ECH)在歷時八年的開發與標準化後,於 2026 年正式以 RFC 9849(主規格)與 RFC 9848(DNS bootstrapping 方法)發布。

ECH 的技術目標

TLS 握手過程中,ClientHello 訊息以明文傳輸,包含 SNI(Server Name Indication)欄位,使得網路上的被動觀察者能看到目標網域名稱。ECH 在 ClientHello 外層加入靜態加密保護:用戶端以一個不具識別性的「外層」SNI(如 cloudflare-ech.com)發起握手,真正的目標網域以加密形式封裝在 inner ClientHello 內。

DNS 角色與弱點

ECH 的設定金鑰透過 DNS HTTPS 資源記錄分發,用戶端在建立連線前需先查詢 DNS 取得伺服器的 ECH 公鑰。規格要求使用安全 DNS(DNS-over-HTTPS 或 DNS-over-TLS)以確保金鑰分發不被竄改。主要弱點是:明文 DNS 可被偽造移除 ECH 金鑰,而強制使用安全 DNS 在受限網路環境中又常被阻擋,形成先有雞還是先有蛋的困境。

伺服器端支援現況

Cloudflare 是目前最大規模的伺服器端實作。OpenSSL 4.0 新增 ECH 支援(歷時多年);Nginx 1.30.0 正式支援 ECH,是主流 Web 伺服器中的重要里程碑;但在作業系統套件管理器中普及仍需數年。主流瀏覽器(Firefox、Chrome、Safari)客戶端支援已趨於完整。

可封鎖性問題

外層 SNI 的靜態替換域名(cloudflare-ech.com

原始來源:Feisty Duck Newsletter Issue 136 — ECH Is Done, But Can We Make It Work?、RFC 9849、RFC 9848


Linux 7.1 合併窗口:近 13,000 個變更集、驅動程式為主、核心記憶體管理改進

LWN.net · 2026-04-27

Linux 7.1 合併窗口於 2026 年四月下旬開放,Jonathan Corbet 記錄了進入 mainline 的重要變更。

規模

7.1 週期合併了近 13,000 個非合併提交(non-merge changesets),以驅動程式為主,但同時包含多項核心範疇的重要功能新增。

記憶體管理:folio 轉換進展

繼上個週期的「pages and folios」參考文章後,7.1 合併窗口推進了 folio(複合頁抽象)在更多記憶體管理路徑中的採用,減少舊版 struct page 的直接使用。此轉換對 THP(Transparent Huge Pages)和大型匿名映射的效能有長期正面影響。

AF_ALG 修補(CVE-2026-31431)

七個穩定版核心(包含 6.12.y、6.6.y 等 LTS 分支)在同一時間窗口收到了 AF_ALG AEAD socket splice() 漏洞(CVE-2026-31431,Copy Fail)的修補,Greg Kroah-Hartman 建議所有用戶立即升級。

驅動程式與平台支援

本週期包含 AMD MI300 GPU 驅動程式更新、LoongArch 架構改進、以及多項網路驅動程式修復,反映了近年 Linux 驅動程式開發以 GPU 加速和新興架構為重心的趨勢。

原始來源:LWN.net — The rest of the 7.1 merge window


End of article
0
Would love your thoughts, please comment.x
()
x