ごみ (プログラミング)
コンピュータにおいて、ごみ、あるいはガベージ (garbage) と呼ばれるものには、以下がある。
- ユーザー利用レベルにおける、処理上意味のないデータ入力、またはそのデータ自体のこと。Garbage in, garbage out参照。
- メモリ管理において、不要となった領域のこと。ガベージコレクション参照。
- 初期化がされていない記憶領域に入っているデータまたはオブジェクト。その内容は実行するたびに異なる可能性がある。
- プログラミングにおいて、一見してバグやエラーを見いだせないが、処理上の問題をもたらしかねないミスのこと。後述。
プログラムにおける「ごみ」の例
[編集]次のC言語のプログラムにおいて、変数xは宣言だけされていて、値が代入されないまま使用される。このとき、「xには“ごみ”が入っている」という。
int main() {
int x;
printf("%d\n",x);
}
xの値の内容は何であるかは保障されず、どんな値が print されるかは定かではない。この例のように単純であれば大きな問題は起きないであろうが(厳密には問題はある。後述する)、例えば何らかの判断条件に使っている値がこのようになっていれば、プログラムの異常な動作の原因の、バグとなる。しかし、ごみの内容は、短い期間に繰り返し実行した場合は同じ値になることが多い。このため、デバッグ時にごみを入れた状態で何度も実行を行っても、同じ動作になり、バグに気がつかないことも多い[1]。一部の言語では、あらかじめなんらかの値で初期化されることが保証される、という仕様とすることで回避したり、初期化も代入もされないまま使用される可能性があれば[2]エラーとなる言語もある。また近年の、フロー解析などのような高度なコンパイラ最適化により、バグの可能性を検出できるパターンもあり、警告オプションを付けることで警告を出させることができる場合もある。
例に示したコードでは単に値を見るだけのため問題は少ないが、C言語ではポインタによって、メモリの中のどこかわからない所にメチャメチャな値を書き込むということができてしまう(しばしば「爆撃」と形容される)。大規模であればすぐ発覚するのでむしろ運が良い方で、バグがある箇所とは全く関係がない場所で誤動作を起こすような「ピンポイント爆撃」になっていると、しばしばデバッグが極めて困難な不具合となる。
なお厳密には、例に示したコードにおけるxの値は、標準規格では「不定」(indeterminate) としており、標準規格ではそのような変数の使用は「未定義」である。未定義とは、プログラマの鼻から悪魔を飛び出させてもよい、という意味であり(en:Undefined behaviorを参照)、普通は避けなければならない。
また、このような「ごみ」は「コンピュータ・アーキテクチャと情報セキュリティ」の観点からは、より深刻な問題がある。キャッシュや、メモリをプロセスに割り当てる単位である「ページ」は、マルチプロセスのシステムでは一般に他のプロセスやカーネルと共通のことがあり、パスワードなどの機微情報を含んでいるかもしれない。従って、ハードウェアないしOSの層のどこかで、ゼロあるいはランダムで潰すか、フラグ等によりそのプロセスからまだ書き込みがされていないアドレスからの読み出しを禁止しなければならない。