ブログ 約3分

C++にメモリ安全性をもたらすために、これまでどんな試みがなされてきたか?

Share this article
C++にメモリ安全性をもたらすために、これまでどんな試みがなされてきたか?

C++は、柔軟性とパフォーマンスで知られる強力で広く使用されているプログラミング言語です。しかし、その歴史的な欠点の一つは、組み込みのメモリ安全性機能がないことでした。これにより、バッファオーバーフロー、ダングリングポインタ、メモリリークなど、さまざまな種類のメモリ関連のバグが発生する可能性があります。

これは数十年にわたって続いてきたよく知られた問題であり、それに対処するために多くの試みがなされてきました。残念ながら、どれも完全な解決策を提供するには至っていません。

言語のメモリ安全性を改善するために、これまで何が行われてきたのでしょうか?

ガベージコレクタ

ガベージコレクタ(GC)は、プログラミング言語やランタイム環境で使用されるメカニズムで、プログラムによってもはや使用されていないメモリを自動的に回収します。その主な目的は、メモリの割り当てと解放を管理し、手動のメモリ管理の負担から開発者を解放し、メモリリークやダングリングポインタなどの一般的なメモリ関連のエラーを防ぐのを助けることです。

C++では、2008年に ガベージコレクションと到達可能性ベースのリーク検出の最小限のサポート がC++0xに追加されました。それ以来、多くの提案がなされてきました。残念ながら、そのどれもがすべてのケースに対処することはできず、ガベージコレクタはC++23で完全に削除されました。

ボローチェッカー

ボローチェッカーはRustプログラミング言語の主要な機能であり、コンパイル時にプログラム内の参照の所有権と借用を静的に分析することで、メモリ安全性を強制しデータ競合を防ぎます。これはRustの中核的なイノベーションの一つであり、その所有権モデルの基本的な側面です。

そこで疑問が生まれます。なぜこのメカニズムをC++に導入しないのでしょうか?

2021年、Google Chromiumチームがこの質問に答えようとしました。彼らの 結論の論文で、次のように結論づけました。

一見すると、上記で定義した型によってC++のボローチェックの記述に成功したように思われます。残念ながら、成功していません。

実際、彼らの論文で説明されているように、多くの課題が未解決のままであり、ボローチェックは最終的にC++に追加できませんでした。

ランタイムチェッカー

C++のランタイムチェックには、プログラムの動作を検証し実行中にエラーを検出するためのさまざまなメカニズムと手法が含まれます。C++では、これらはサニタイザーと呼ばれます。ClangおよびGCCコンパイラの一部であり、プログラム実行中にエラーを捕捉するためのランタイム計装を提供します。これらのサニタイザーは一般的に開発およびテスト段階で問題を特定し修正するために使用されます。しかし、本番環境では一般的に使用されず、本番環境で発生する多くの問題は開発中には遭遇しない可能性があります。

開発中でさえ、サニタイザーは普遍的に採用されておらず、必ずしも使用されるとは限りません。

次は?

現在、Stroustrupはこの安全性の問題に対する潜在的な解決策に取り組んでいます。それはC++プロファイル(つまり、従うことで特定の安全性の保証を達成するルールのセット)と呼ばれています。これらはISO C++標準によって定義され、ポインタや配列範囲などの一般的な安全性の問題に対処するものです。

彼は GitHubリポジトリを作成し、人々が提案を提出でき、彼がドラフトを共有できるようにしています。これにより、妥当な期間内にこの作業を前進させることのできるコミュニティの構築に貢献しています。

結論

C++は、包括的なメモリ安全性を言語に導入しようとする試みに抵抗し続けてきました。しかし、この重大な問題に対する決定的な解決策を見つけることがますます緊急になっています。おそらく、この問題をミレニアム懸賞問題に追加することを検討すべきでしょう。:)

Share this article