オーバーフロー 【overflow】 桁あふれ
概要
オーバーフロー(overflow)とは、あふれ(る)、あふれ出たもの、という意味の英単語。ITの分野では、数値の計算結果がその格納領域に収まる範囲を超えること(算術オーバーフロー/桁あふれ)や、与えられたデータが多すぎて指定の領域に収まりきらないこと(バッファオーバーフローなど)を指す。算術オーバーフロー
コンピュータ内部で一般的な数値データを格納するメインメモリ上の領域やCPU内部のレジスタは、一つの数値を決まったデータ量で表すようにできており、取り扱える数値の大きさや桁数に上限がある。
数値を計算した結果がこの上限を超え、正しく格納・表現できなくなってしまうことを「オーバーフロー」という。例えば、1バイトの符号なし整数型は0から255までの整数を表現できるため、「150×2」という計算の結果を格納しようとすると上限を超えてしまいオーバーフローとなる。
オーバーフローが発生した際の対処方法として、例外を引き起こして例外処理ルーチンによって何らかの対処を行う場合、実行時エラーを出力してプログラムを停止する場合、表現可能な上限値を設定する場合、上限を超えたことを示す特殊な値を格納する場合、単に無視する場合などがある。
オーバーフローを無視してそのまま処理を続行した場合、あふれた上位の桁が消滅して奇妙な値が計算結果となったり、メモリ領域上の隣接する無関係の区画にあふれた数値データの一部を書き込んで内容を破損させてしまうといった事象が起きる場合もある。
負数や浮動小数点数の場合
オーバーフローが起きるかどうかは桁の大きさの問題であるため、符号付き整数の場合には負数の値が下限を超えた場合(絶対値の桁数が上限を超えた場合)にも発生する。また、浮動小数点の場合には指数部の大きさが上限値よりも大きくなった場合にそれ以上大きな値を表すことができずオーバーフローとなる。
アンダーフロー(underflow)
浮動小数点数において、値の絶対値が小さくなりすぎ(小数点以下の0の桁数が長くなりすぎ)て正しく値を表現できなくなる現象を「アンダーフロー」(underflow)という。指数部が下限値より小さくなることで発生し、0に置き換えられてしまうことで除算や乗算の結果が大きく狂うといったことが起きる。
メモリ領域のオーバーフロー
外部からデータを受け取ってメモリ上の領域に保存するようなプログラムで、指定された領域のサイズを超えてデータを受け取ってしまい、隣接する別の区画にデータをあふれさせてしまうことを「オーバーフロー」あるいは「オーバーラン」(overrun)ということがある。
無関係の領域にデータを書き込んでしまうことにより、処理が停止したり、予期しない動作が発生することがある。バッファ領域について発生するものを「バッファオーバーフロー」、スタック領域について発生するものを「スタックオーバーフロー」という。
ネットワークを通じて外部からコンピュータを乗っ取る攻撃手法の一つとして、不正なデータを送りつけて受信プログラムにわざとオーバーフローを発生させ、攻撃用のプログラムコードを実行するよう仕向ける手法があり、「バッファオーバーフロー攻撃」と呼ばれる。