LLVM 項目用 C++ 開發緩衝區安全處理

LLVM 專案的開發人員提出了一些更改,旨在加強關鍵任務 C++ 專案的安全性,並提供一種方法來消除緩衝區溢位所造成的錯誤。 這項工作主要集中在兩個領域:提供允許安全使用緩衝區的開發模型,以及努力加強 libc++ 標準函數庫的安全性。

建議的 C++ 安全編程模型涉及在使用緩衝區時使用標準庫提供的類,而不是操作裸指針。 例如,建議使用 std::array、std::vector 和 std::span 類,這將為過度分配的記憶體添加運行時檢查。

為了打擊 clang 中的危險編程實踐,建議顯示所有指針算術運算的編譯器警告,類似於使用“cppcoreguidelines-pro-bounds-pointer-arithmetic”標誌時輸出的 clang-tidy linter 警告,對此的支持將出現在版本LLVM 16 中。為了啟用此類警告,將向clang 新增單獨的標誌,預設情況下不處於活動狀態。

計劃在 libc++ 中實作一個可選的增強保護模式,啟用該模式後,將在運行時捕獲一些導致未定義行為的情況。 例如,在 std::span 和 std::vector 類別中,將監視越界記憶體訪問,如果偵測到,程式將崩潰。 開發人員相信,添加此類變更將使 libc++ 保持符合 C++ 標準,因為如何處理未定義行為的情況取決於程式庫開發人員的選擇,他們可能會將未定義行為視為失敗,從而要求程式終止。

libc++ 中的執行時間檢查計畫分為可單獨啟用的類別。 一些建議的檢查不會導致操作的複雜性或 ABI 的更改,已經在 libc++ 安全模式中實現。

此外,計劃準備用於調整程式碼的工具,允許您用容器替換帶有裸指針的變量,並在容器無法直接替換指針的情況下使用替代處理程序(例如,“if(array_pointer)”構造可以轉換為“if(span.data) ()”)。調整不僅可以應用於局部變量,還可以應用於指標類型的參數。

來源: opennet.ru

添加評論