本影片將探討 C 及 C++ 社群如何應對目前熱烈的記憶體安全議題,以及開發者們如何使 C 及 C++ 語言達到記憶體安全。
美國政府的推動
美國政府,特別是網路安全和基礎設施安全局 (CISA) 和聯邦調查局 (FBI),正大力推動從 C 和 C++ 轉向更注重記憶體安全的語言,如 Rust。
-
CISA 網站上提到,針對現有的以記憶體不安全語言編寫的產品,若未在 2026 年 1 月 1 日前發布記憶體安全路線圖,將會對國家安全、經濟安全以及公共衛生和安全構成重大風險。
-
CISA 建議軟體製造商應以系統性方式防止記憶體安全漏洞,例如使用記憶體安全語言或硬體功能。
C 及 C++ 社群的回應
這個推動引發了 C 及 C++ 社群的廣泛討論和批評。C 及 C++ 開發者不滿被認為技術能力不足,或是認為 C 及 C++ 語言本身存在缺陷。
-
C 及 C++ 都是優秀的語言,同時 Rust 也是一個提供強大安全保證的優秀語言。
-
許多底層套件是用 C 語言編寫的。
記憶體安全問題的嚴重性
儘管 C 及 C++ 語言各有優點,但不可否認的是,記憶體安全漏洞是一個需要解決的重要問題。
-
微軟報告指出,每年透過安全更新解決的漏洞中,約有 70% 是記憶體安全問題。
-
Google 發現 Chromium 專案中約 70% 的嚴重安全錯誤都是記憶體安全問題。
-
Mozilla 報告稱,他們分析的 34 個嚴重高危漏洞中,有 32 個(94%)與記憶體相關。
-
Google 的 Project Zero 團隊發現,在野外利用的零日漏洞中,67% 是記憶體損壞漏洞。
這些問題包括緩衝區溢位、釋放後使用 (use-after-free)、堆疊和堆積耗盡、記憶體洩漏、空指標解引用 (null pointer dereference) 和懸掛指標 (dangling pointer) 等。
C 及 C++ 開發者的選擇
許多 C 及 C++ 開發者不願意學習 Rust,他們認為 Rust 的學習成本太高、不夠安全,而且重寫程式碼庫非常麻煩。
-
他們熱愛 C 及 C++,希望繼續使用這些語言,而不必學習新語言。
-
Rust 除了記憶體安全之外,並沒有提供相較於 C 及 C++ 的重大優勢。
因此,一些開發者開始討論甚至實施如何將記憶體安全引入 C 及 C++ 語言中,而不是放棄這些語言。
記憶體安全解決方案
以下介紹三種旨在將記憶體安全引入 C 及 C++ 的解決方案:
Safe C++ Project
Safe C++ 旨在擴展 C++ 的安全性,創建一個 C++ 的超集,提供與 Rust 程式碼相同的安全保證。
-
主要功能包括安全上下文、借用檢查 (borrow checking)、初始化分析、模式匹配、選擇型別 (Choice types) 以及借用線程安全功能。
-
目標是在保持效能和零成本抽象的同時實現這些功能。
-
這不僅僅是最佳實踐,而是一項用於確保記憶體安全的新技術,包括編譯時智慧。
-
目前仍在開發中,尚未完全實現,但相關提案已公開。
Phil C
Phil C 是由 Epic Games 的語言工程高級總監 Philip Pizlo 創建的記憶體安全 C 語言變體。
-
目標是與 C 和 C++ 100% 相容,只需使用 Phil C 編譯器即可獲得記憶體安全。
-
Phil C 不允許任何形式的「逃生艙口」(escape hatch),例如 Rust 中的
unsafe
關鍵字。 -
大多數程式無需修改即可編譯和運行。
-
目前僅適用於 Linux,速度比傳統 C 慢 1.5 到 5 倍,但正在努力優化效能,目標是達到 1.2 倍的速度。
-
作者希望 Phil C 能消除對 Rust 的需求。
Trap C
Trap C 是在 2024 年 11 月於泰國曼谷舉行的 w214 會議上,由 Robin Row 提出的一種新的記憶體安全 C 語言變體。
-
可以將其視為 C 的一個記憶體安全分支。
-
旨在創建一個記憶體安全的 C 版本,防止常見的漏洞,如緩衝區溢位、分段錯誤和記憶體洩漏。
-
設計上與 C 連結相容,使用相同的 ABI(應用程式二進位介面)。
-
安全功能包括指標不能產生分段錯誤或緩衝區溢位、自動記憶體管理以防止洩漏、無
unsafe
關鍵字,以及類似 C 和 C++ 的語法,使 C 程式設計師更容易採用。 -
與 C 的不同之處在於,Trap C 包含 C++ 建構子和解構子,刪除了一些不常用的關鍵字,並實現了自動邊界檢查和指標歸零 (pointer nullification)。
結論
C 及 C++ 社群似乎不打算學習新的語言,而是致力於以某種方式使現有語言具有記憶體安全性。