オーバーフロー

出典: 謎の百科事典もどき『エンペディア(Enpedia)』
ナビゲーションに移動 検索に移動
オーバーフローした電卓

オーバーフローとは、が、上限を超えてあふれること。

電卓[編集]

電卓では、計算の結果が表示器に書ききれないときに、オーバーフローする。例えば、冒頭の写真の電卓は、10桁の電卓なので、計算結果が11桁以上、つまり100億以上になるとオーバーフローする。負の数でも、絶対値がこの例では11桁以上になるとオーバーフローする。オーバーフローするとE(←Error)を示す電卓が多い。しかし、オーバーフローしても計算自体はでき、ピリオドより上の桁の数のせいでオーバーフローしたことになる。上の写真では、ピリオドのすぐ下の桁が本来の上限なので、そこを10桁目(すなわち十億の位)とみなし、「26京4042兆1339億」と読める。端数は切り捨てられる。オーバーフローするとそれ以上の計算はできないが、「C」キーを押すと、それを小数とみなして計算ができる。

コンピューター[編集]

コンピューターにおけるオーバーフローに類するものをいくつか記載する。

算術オーバーフロー[編集]

CPUではレジスターのサイズ、プログラミングでは変数のサイズにおいて、最大値に対してさらに加算を行なった場合に発生する。 例えば32ビット(レジスター、または変数)の場合、符号なし整数の最大値は4,294,967,295であるが、1を加算すると0になってしまう。これは、16進数で表すと0xFFFFFFFFから0x00000000となる。

算術アンダーフロー[編集]

オーバーフローの対義語。マイナス方向という意味ではなく、浮動小数点数の値の精度が限りなく低くなってゼロになってしまうことを指す。

バッファーオーバーフロー[編集]

jawp:バッファオーバーランとも言う。
配列領域のサイズを超えるデータを書き込もうとした場合に、サイズのチェックをせずに書き込もうとすると、配列のメモリー領域を超えてバッファーの外にデータを書き込んでしまう。これがバッファーオーバーフローである。
さらにバッファーの外に実行コード領域があった場合、実行コードを書き換えることができてしまう。配列の領域外をチェックせずに書き込めてしまうプログラミング言語で作られたソフトウェアの場合、これがセキュリティーホールの原因になりやすい。バッファーの残りサイズをしっかり確認するようにしたり、OSレベルやプログラミング言語レベルで[1]配列の領域外に書き込めないようにする、または実行コード領域にデータを書き込めないようにすることで、対策できる。

スタックオーバーフロー[編集]

サブルーチン[2]の実装方式では、呼び出し時にローカル変数をスタックに積んでいく方式[3]がよく用いられるが、単純な線形の領域にスタックを設けることが多いので、サブルーチンの呼び出しの深さが増していくと、あらかじめ設けていたスタック領域を超えてスタックを積んでしまう。これがスタックオーバーフローである。

脚注[編集]

  1. C言語が問題になりやすいが、C言語でも安全な変数を扱うライブラリーを使うことで対策できる。
  2. 数学的でない関数、でもいいが、説明が面倒なので関数は使わないでおく。
  3. ごく単純な実装では、スタックの位置を管理するカウンターを持たせて、その数値の増減でスタックを表現する。