メモリー破壊
読み:メモリーはかい
外語:memory corruption
プログラムが、不正なメモリーの書き換えやメモリー操作を行なうこと。ここで言う破壊とは、物理的な破壊ではなく、論理的な破壊を指す。
概要
例えば、次のような不正操作が想定される。
- 配列の添字の範囲外での代入
- ポインター操作の初期化およびアドレス演算のミスでの予期しない場所への代入
- 動的に確保したメモリー(malloc)に対して1度開放(free)したにも関わらず再度開放してしまう
特徴
挙動
プログラムの内容により、その症状は異なる。
軽度では隣接したデータエリアの内容を破壊することでプログラムが異常動作する程度だが、データエリアを超えてプログラムコードそのものを書き換えてしまったり、自分のプログラムに割り当てられたメモリーの外まで書き換えてしまうなどまでいくと、システムとして致命傷ともなりうる。
このため、UNIXや32ビットWindowsなど、メモリー保護機能を持つマルチタスクオペレーティングシステムではプログラム割り当て外のメモリー破壊を検知し、それを行なったプログラムをシステムが強制終了することができる。
この時、UNIXでは「Segmentation fault」、Windowsでは各種の例外エラーとして通知される。
言語による差
アドレスを直接扱うことができる、アセンブリ言語やCなどのプログラミング言語に特有のミスである。
より高級な言語では配列範囲外のアクセスなどは厳密にチェックされるため、通常は致命的な問題にならずエラー個所を指摘した上でエラー終了となる。
プログラム初心者、商業プログラマーでも新人レベルでは発見・対処が比較的難しいバグであり、かつ簡単に引き起こしやすいバグでもある。
大昔
高等テクニックとして、プログラムコードを実行中に書き換える事でプログラムの流れを制御したりする手法が、特にメモリーの少なかった初期(8ビットマイクロプロセッサーの時代)のコンピューター向けに一部で使われた。
しかしこれは、プログラムの可読性が極端に悪くなる上、マルチタスクやメモリー保護の環境に対応しにくく、実行環境に依存して移植性が悪くなるなどの理由により、現在では御法度の技とされている。
ただし、自己進化型のプログラムなど特定の目的のために、研究機関などでは今でもこれに近い技術が使われている場合もある。
再検索