コンピューティングにおいて、シャドウメモリとは、プログラム実行時に使用されるコンピュータメモリ上の情報を追跡・保存する技術です。シャドウメモリは、メインメモリ内の個々のビットまたは1つ以上のバイトにマッピングされるシャドウバイトで構成されています。これらのシャドウバイトは通常、元のプログラムからは見えず、元のデータに関する情報を記録するために使用されます。
この手法は、メモリエラーチェッカーによって利用されます。メモリエラーチェッカーは、チェック対象のプログラムに割り当てられたメモリ領域に関する情報を保存できます。このシャドウメモリは、プログラムがセグメンテーション違反などによってクラッシュしていない場合でも、メモリへの不正アクセスを検出して報告するために使用されます。エラーチェッカーは、どのビットが定義されていて、どのビットが定義されていないかといったメモリに関する追加情報も保存する場合があります。Valgrindスイートの一部であるMemcheckは、この情報を利用して、未定義のメモリ値の操作や出力によって生じる未定義の動作を検出します。
ただし、シャドウメモリの使用はメモリエラーチェッカーに限定されません。シャドウバイトに格納される情報は固定されていないためです。例えば、データ競合検出ツールであるThreadSanitizerでも使用されています。
シャドウメモリは、実装方法も使用方法も多岐にわたり、それぞれ異なるパフォーマンス特性を持っています。例えば、Memcheck はビット精度で値を追跡しますが、clangコンパイラの一部であるAddressSanitizerは比較的高速です。Memcheck は、他の Valgrind ツールと同様に、バイナリ変換とインストルメンテーションを使用して、プログラムメモリの使用状況に応じてシャドウメモリを操作するコードを実行します。一方、AddressSanitizer はコンパイル時に作成され、コンパイル時にプログラムにエラーチェックコードをインラインで挿入します。そのシャドウメモリ実装では、シャドウメモリ用に仮想メモリを大量に予約するため、パフォーマンス特性が大きく異なります。
{{cite book}}:|work=無視されました (ヘルプ)