後端工坊 2026 年 6 月 25 日

2026-06-24 — eBPF JIT 加入 KASAN 記憶體檢查、C++ 虛擬函式記憶體佈局深析、C++23 完整指南草稿電子書上線

primary=https://bootlin.com/blog/ebpf-at-lsfmmbpf-2026/ primary=https://ebpf.foundation/strengthening-ebpf-security-progress-on-audit-and-runtime-hardening/ primary=https://pvs-studio.com/en/blog/posts/cpp/1369/ primary=https://leanpub.com/cpp23

為 JIT 編譯的 eBPF 程式加入 KASAN 記憶體檢查支援

Bootlin · 2026-06-18

背景

Bootlin 工程師 Alexis Lothoré 正在推進一項長期計畫:將 KASAN(Kernel Address Sanitizer)記憶體存取檢查機制延伸至 Linux 核心的 JIT 編譯 eBPF 程式碼。這項工作由 Bootlin、eBPF Foundation 及 Alpha-Omega Foundation 三方合作資助,2026 年 6 月 23 日 LWN.net 對其進展進行了深入報導。該功能主要面向核心開發者,目的是讓他們更早發現 eBPF 子系統(包含 verifier 與 JIT 編譯器)中的記憶體存取錯誤。

核心改動

KASAN 是 Linux 核心既有的動態記憶體錯誤偵測工具,能抓出越界存取(out-of-bounds)與釋放後使用(use-after-free)等錯誤。然而現有的 KASAN 基礎設施無法感知 JIT 編譯產生的機器碼,使得 eBPF JIT 編譯器本身的 bug 難以被早期偵測。Lothoré 的方案是在 JIT 編譯階段主動插入 KASAN 檢查指令,讓每次 eBPF 程式執行時都能進行記憶體合法性驗證。

開發歷程分為數個階段。2026 年初,Lothoré 在 BPF 郵件列表發出 RFC 定義功能範疇;2026 年 4 月送出 概念驗證(PoC)修補;同年 5 月在克羅埃西亞薩格勒布舉行的 LSFMMBPF 2026 峰會上發表,獲得社群正面回應。

規格細節

技術分析的核心在於:JIT 編譯後的記憶體如何分配、shadow memory 如何映射、哪些記憶體存取類型需要特殊處理。目前確認最關鍵的指令路徑為 BPF_LD、BPF_LDX、BPF_ST 與 BPF_STX,也就是 JIT 翻譯器所產生的載入與儲存操作。此外,private stack、helper 回傳值、以及 map 支援的記憶體區段都是需要特殊考量的範疇。

實作方式包含以下幾個關鍵決策:

  • 透過 Kconfig 旗標(目前僅限 x86-64)控制功能啟用
  • 以直接呼叫 ASAN store/load 函式的方式插入檢查點
  • 修改 verifier 與輔助資料結構以支援選擇性 instrumentation
  • 利用 bpf_testmod kfuncs 回傳無效或已釋放記憶體作為測試驅動

目前開發重點仍在早期開機與執行期的除錯,以及細化 stack 存取的 instrumentation 方式,目標是確定第一個可上游合入版本的功能邊界。

影響範圍

這項功能並非要替 eBPF 終端使用者提供保護,而是給核心維護者在開發週期中更早找出 JIT 編譯器與 verifier 的潛在問題。KASAN 的導入填補了 eBPF 執行期觀測性的重要空缺,讓原本難以重現的記憶體存取錯誤有機會在開發環境中被精確捕捉。隨著 eBPF 在安全監控、網路加速、可觀測性等場景的應用日益廣泛,JIT 編譯器本身的正確性保證也愈形重要。

原始來源:Bootlin — eBPF at LSFMMBPF 2026eBPF Foundation — Strengthening eBPF Security


C++ 虛擬函式的隱藏代價:vtable、vptr 與多重繼承的記憶體佈局

PVS-Studio Blog(isocpp.org 轉載 2026-06-23)

原本的問題

C++ 的動態多型是物件導向設計的核心機制,卻在記憶體佈局上引入了一系列隱性開銷。對多數開發者而言,加上 virtual 關鍵字的代價僅是「多一次間接跳轉」,但 Elizaveta Zhegalova 在 PVS-Studio 部落格發表的系列文章第三篇,深入揭示了虛擬函式、RTTI 與多重繼承對物件實際記憶體佈局的複合影響,並於 2026 年 6 月 23 日由 isocpp.org 轉載推薦。

採用的方法

虛擬函式依賴兩個核心資料結構實作 late binding。Virtual Table(vtable)是編譯期產生的靜態函式指標陣列,每個類別一份,紀錄所有虛擬函式的最終實作位址,支援 O(1) 查詢。Virtual Pointer(vptr)是編譯器自動插入的 8 位元組隱藏欄位,指向對應的 vtable,並於子類別建構函式完成後更新為子類別的 vtable 位址。

這兩個結構帶來直接的記憶體膨脹效應:一個只含一個 virtual 函式與一個 char 欄位的類別,理論上應佔 9 個位元組,但因對齊要求實際擴展至 16 個位元組。多重繼承進一步加劇問題——菱形繼承讓物件中包含兩份完整的祖父類別資料副本,造成冗餘與語義不一致。

Virtual inheritance 透過引入 vbptr(virtual base pointer)與 vbtable(virtual base table)解決資料重複問題,並藉由 VTT(Virtual Table Hierarchy Table)確保多層建構函式的正確初始化順序。然而這些額外的間接層也帶來了顯著的記憶體與效能代價:MSVC 在複雜虛擬繼承體系下可將物件膨脹至 96 位元組,而有效資料僅佔其中約三分之一。

實際效果

文章記錄了數個實際的效能與正確性陷阱:

  • 指標偏移問題:多重繼承下,同一物件以不同父類別指標存取時位址不同;透過 void* 強制轉型會遺失偏移資訊,產生無效指標
  • Empty Base Optimization 失效:virtual inheritance 阻止編譯器對空基底類別的壓縮最佳化
  • 快取效率下降:virtual inheritance 將物件資料分散於記憶體,CPU 需多次快取載入才能存取服務指標與實際資料
  • CRTP 的侷限:替代方案 CRTP 在繼承體系複雜時往往帶來更難維護的程式碼

文章最終評估指出,在業務邏輯夠複雜的場景下,標準虛擬函式仍是可接受的選擇,因為查詢開銷相對於邏輯複雜度可忽略不計。理解這些底層機制,使開發者能在多型彈性與記憶體效率之間做出有憑據的架構決策。

原始來源:PVS-Studio — Silent foe or quiet ally: Brief guide to alignment in C++. Part 3


《C++23 完整指南》草稿電子書上線,350 頁涵蓋標準全部新特性

Leanpub · 最後更新 2026-06-22

背景

C++ 標準委員會在 2023 年正式通過 C++23 標準,為語言帶來大量實用的新功能。Nicolai M. Josuttis 繼《C++17 完整指南》與《C++20 完整指南》之後,再度以「Complete Guide」系列形式撰寫 C++23 的系統性文件。2026 年 6 月 22 日,草稿電子書更新至 80% 完成度,以早鳥折扣形式在 Leanpub 平台開放購買,購買者將自動獲得最終完整版更新。

核心改動

草稿目前共 350 頁,以範例程式為主軸說明各項新功能。語言核心層面最重要的新增包括:

  • Deducing this:以明確物件參數(explicit object parameter)取代隱含的 this 指標,大幅簡化 CRTP 等慣用法並支援遞迴 lambda
  • auto()auto{}:建立物件的衰退副本(decay copy),解決舊有語法在泛型情境下的歧義
  • 多維 operator[]:支援 obj[x, y, z] 語法,直接服務矩陣與多維陣列運算庫

規格細節

std::expected<> 的加入是 C++23 錯誤處理模式的重大演進,搭配 monadic 操作(and_thentransformor_else)可在不依賴例外的前提下組合可能失敗的操作;std::optional<> 也獲得同樣的 monadic 擴充。標準程式庫亦新增 std::print()std::println(),整合 std::format 的格式化能力並支援字串、tuple、pair 及容器的直接輸出。

Ranges 與 Views 在 C++23 獲得大幅擴充,涵蓋多個新 view 組件與透過 std::from_range 從 range 直接初始化容器的能力。書中另詳述以下幾個重要主題:

  • 模組系統:標準程式庫模組 import std; 與相容性模組 import std.compat;
  • std::generator<>:C++23 標準化的協程生成器介面,含詳細例外處理說明
  • std::mdspan:多維連續記憶體視圖,無需所有權轉移即可表達矩陣與張量
  • std::stacktrace:標準化的呼叫堆疊擷取與格式化工具

影響範圍

C++23 的部分修正直接源自先前標準的缺陷報告,例如 range-based for 迴圈的生命週期問題與部分標準程式庫行為的釐清。對於已採用 C++17 或 C++20 的專案,本書提供了作者統一詮釋、附有完整範例的遷移參考。透過 Leanpub 早鳥方案購入者,未來最終版發布時將自動取得更新,最低售價為 27.90 美元,建議售價為 39.90 美元;紙本版將另行單獨販售。

原始來源:Leanpub — C++23: The Complete Guide


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