LLVM プロジェクトは、C++ でバッファを安全に操作するためのツールを開発しています。

LLVM プロジェクトの開発者は、ミッションクリティカルな C++ プロジェクトのセキュリティを強化し、バッファのオーバーランによって引き起こされるエラーを排除する手段を提供することを目的とした多くの変更を提案しました。 この作業は、バッファを使用した安全な作業を可能にする開発モデルの提供と、関数の libc++ 標準ライブラリのセキュリティの強化の XNUMX つの領域に焦点を当てています。

提案されている C++ の安全なプログラミング モデルでは、バッファを操作するときに、裸のポインタを操作するのではなく、標準ライブラリによって提供されるクラスを使用します。 たとえば、過剰に割り当てられたメモリの実行時チェックを追加する std::array、std::vector、および std::span クラスを使用することが提案されています。

Clang での危険なプログラミング慣行に対抗するために、「cppcoreguidelines-pro-bounds-pointer-arithmetic」フラグを使用したときに出力される Clang-Tidy リンター警告と同様に、すべてのポインター算術演算に対してコンパイラー警告を表示することが提案されています。このような警告を有効にするには、デフォルトではアクティブではない別のフラグが Clang に追加されます。

libc++ にはオプションの拡張保護モードが実装される予定で、これを有効にすると、未定義の動作につながるいくつかの状況を実行時に捕捉します。 たとえば、std::span クラスと std::vector クラスでは、境界外のメモリ アクセスが監視され、検出されるとプログラムがクラッシュします。 開発者は、そのような変更を追加することで、libc++ が C++ 標準に準拠した状態を維持できると信じています。これは、未定義の動作が発生した場合の処理​​方法の選択はライブラリ開発者にあり、ライブラリ開発者は、とりわけ、未定義の動作を失敗として扱う可能性があるため、終了するプログラム。

libc++ のランタイム チェックは、個別に有効にできるカテゴリに分割される予定です。 提案されたチェックの一部は、操作の複雑さや ABI への変更をもたらさないもので、すでに libc++ セーフ モード内に実装されています。

さらに、コードを調整するためのツールを準備する予定です。これにより、変数をコンテナーで裸のポインターに置き換えたり、コンテナーがポインターを直接置き換えられない状況で代替ハンドラーを使用したりできるようになります (たとえば、「if(array_pointer)」コンストラクトは、 「if(span.data)()」に変換されます。調整はローカル変数だけでなく、ポインタ型のパラメータにも適用できます。

出所: オープンネット.ru

コメントを追加します