ごみ (プログラミング)

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

コンピュータにおいて、ごみ、あるいはガベージ (garbage) とばれるものには、以下いかがある。

  1. ユーザー利用りようレベルにおける、処理しょりじょう意味いみのないデータ入力にゅうりょく、またはそのデータ自体じたいのこと。Garbage in, garbage out参照さんしょう
  2. メモリ管理かんりにおいて、不要ふようとなった領域りょういきのこと。ガベージコレクション参照さんしょう
  3. 初期しょきがされていない記憶きおく領域りょういきはいっているデータまたはオブジェクト。その内容ないよう実行じっこうするたびにことなる可能かのうせいがある。
  4. プログラミングにおいて、一見いっけんしてバグエラーいだせないが、処理しょりじょう問題もんだいをもたらしかねないミスのこと。後述こうじゅつ

プログラムにおける「ごみ」のれい[編集へんしゅう]

つぎC言語げんごのプログラムにおいて、変数へんすうxは宣言せんげんだけされていて、代入だいにゅうされないまま使用しようされる。このとき、「xには“ごみ”がはいっている」という。

int main() {
   int x;
   printf("%d\n",x);
}

xの内容ないようなにであるかは保障ほしょうされず、どんなが print されるかはさだかではない。このれいのように単純たんじゅんであればおおきな問題もんだいきないであろうが(厳密げんみつには問題もんだいはある。後述こうじゅつする)、たとえばなんらかの判断はんだん条件じょうけん使つかっているがこのようになっていれば、プログラムの異常いじょう動作どうさ原因げんいんの、バグとなる。しかし、ごみの内容ないようは、みじか期間きかんかえ実行じっこうした場合ばあいおなになることがおおい。このため、デバッグときにごみをれた状態じょうたいなん実行じっこうおこなっても、おな動作どうさになり、バグにがつかないこともおお[1]一部いちぶ言語げんごでは、あらかじめなんらかの初期しょきされることが保証ほしょうされる、という仕様しようとすることで回避かいひしたり、初期しょき代入だいにゅうもされないまま使用しようされる可能かのうせいがあれば[2]エラーとなる言語げんごもある。また近年きんねんの、フロー解析かいせきなどのような高度こうどコンパイラ最適さいてきにより、バグの可能かのうせい検出けんしゅつできるパターンもあり、警告けいこくオプションをけることで警告けいこくさせることができる場合ばあいもある。

れいしめしたコードではたんるだけのため問題もんだいすくないが、C言語げんごではポインタによって、メモリのなかのどこかわからないところにメチャメチャなむということができてしまう(しばしば「ばくげき」と形容けいようされる)。だい規模きぼであればすぐ発覚はっかくするのでむしろうんほうで、バグがある箇所かしょとはまった関係かんけいがない場所ばしょ誤動作ごどうさこすような「ピンポイントばくげき」になっていると、しばしばデバッグがきわめて困難こんなん不具合ふぐあいとなる。

なお厳密げんみつには、れいしめしたコードにおけるxのは、標準ひょうじゅん規格きかくでは「不定ふてい」(indeterminate) としており、標準ひょうじゅん規格きかくではそのような変数へんすう使用しようは「未定義みていぎ」である。未定義みていぎとは、プログラマのはなから悪魔あくまさせてもよい、という意味いみであり(en:Undefined behavior参照さんしょう)、普通ふつうけなければならない。

また、このような「ごみ」は「コンピュータ・アーキテクチャと情報じょうほうセキュリティ」の観点かんてんからは、より深刻しんこく問題もんだいがある。キャッシュや、メモリをプロセスにてる単位たんいである「ページ」は、マルチプロセスのシステムでは一般いっぱんのプロセスやカーネルと共通きょうつうのことがあり、パスワードなどの機微きび情報じょうほうふくんでいるかもしれない。したがって、ハードウェアないしOSのそうのどこかで、ゼロあるいはランダムでつぶすか、フラグとうによりそのプロセスからまだみがされていないアドレスからのしを禁止きんししなければならない。

脚注きゃくちゅう[編集へんしゅう]

  1. ^ 近年きんねんでは積極せっきょくてきに、ランダムあるいはなんらかの変化へんかするパターンを使つかい、バグの顕在けんざいはかるようなシステムもある。
  2. ^ これは構造こうぞうてきに、たとえば if - else if - が羅列られつされていた場合ばあい最後さいごの else でかなら初期しょきする、といったようになっている必要ひつようがある。