newsence
來源篩選

-fbounds-safety: Enforcing bounds safety for C

Hacker News

This document introduces -fbounds-safety, a Clang extension designed to eliminate out-of-bounds memory accesses in C by using bounds annotations and implicit fat pointers to turn potential vulnerabilities into deterministic traps.

newsence

-fbounds-safety:為 C 語言強制執行邊界安全

Hacker News
12 天前

AI 生成摘要

本文介紹了 -fbounds-safety,這是一個 Clang 擴充功能,旨在透過邊界註解與隱式胖指標來消除 C 語言中的越界記憶體存取,將潛在的安全漏洞轉化為確定性的陷阱。

背景

這篇技術文件介紹了 Clang 編譯器的一項實驗性擴展 -fbounds-safety,旨在透過為 C 語言引入邊界檢查機制,從根本上消除緩衝區溢位等記憶體安全漏洞。該方案要求開發者在指標上添加註解(如 __counted_by),讓編譯器能在執行期或編譯期自動插入檢查邏輯,並透過「寬指標」技術降低開發者的標註負擔,同時維持與現有 C 語言 ABI 的相容性。

社群觀點

Hacker News 社群對此提案展現了高度興趣,但也對其實際採用的門檻抱持審慎態度。支持者認為,儘管 Rust 等現代語言興起,但現實世界中仍有數以億計的 C 語言程式碼在運行,這種能與現有 ABI 相容並支援漸進式採用的方案,是提升遺留系統安全性的務實之道。部分討論指出,這類技術在 Apple 的作業系統環境中已有數百萬行程式碼的實踐經驗,證明其在消費級產品中的可行性。

然而,許多討論聚焦於「標註負擔」與「自動化程度」之間的權衡。反對意見認為,這並非一個「設定即忘」的編譯開關,開發者仍需手動標註變數間的長度關係,這在大型既有專案中是一項龐大的工程。有評論者將其與 Google 在 C++ 標準函式庫中啟用的硬化機制(Hardening)對比,後者幾乎不需要修改原始碼且效能損耗極低,因此更具吸引力。此外,部分開發者質疑,如果已經願意投入大量精力修改原始碼,為何不直接轉向 C++ 的 std::span 或其他更現代的封裝方式,甚至直接改用 Rust。

關於安全性的本質,社群中也出現了激烈的辯論。有觀點認為邊界檢查只是解決了記憶體安全的一小部分,諸如「釋放後使用」(Use-After-Free)或邏輯錯誤導致的類型混淆,才是成熟軟體中更常見且難以防禦的威脅。但也有技術專家反駁,邊界檢查是軟體安全的「基本盤」,就像火車自動防護系統一樣,雖然不能防止所有事故,但能有效攔截最常見的人為疏失。

最後,關於工具鏈的現狀也引發了討論。雖然這項功能目前主要由 Apple 推動並存在於其 LLVM 分支中,但 Linux 社群普遍仍依賴 GCC,且 GCC 現有的 _FORTIFY_SOURCE 雖然範圍較窄,但勝在無需額外標註即可提供基礎保護。開發者們普遍期待這項功能能儘速併入 LLVM 主線,並希望未來能有自動化工具輔助生成這些邊界註解,以降低推廣阻力。

延伸閱讀

  • libc++ Hardening: Google 在生產環境中使用的 C++ 函式庫硬化技術,效能損耗低於 0.5%。
  • Pizlix (Fil-C): 一個基於 Linux From Scratch 的實驗性作業系統,其使用者空間完全使用具備記憶體安全性的 Fil-C 編譯。
  • Solaris SPARC ADI: Solaris 作業系統自 2015 年起在 SPARC 硬體上實現的硬體輔助記憶體檢查技術。
  • Apple LLVM Fork: 目前 -fbounds-safety 預覽版實作所在的 GitHub 儲存庫。