画像ツール一覧

オーバーフロー

Overflow

PC・システムのきほん

コンピュータが扱える数値の範囲や、割り当てられたメモリ容量の上限を超えて、データが溢れ出してしまう状態やエラーのことです。

🐾 猫で例えると?

一人用ハンモックに茶トラとアメショが無理やり入り、収まりきらずに体が外へ溢れ出している様子。
定員オーバーで溢れ出す幸せの重み

一人用のハンモックからはみ出す茶トラとアメショを、「用意した範囲に収まらない」状態に見立てています。ただし数値のオーバーフローでは、必ず隣のメモリへデータが漏れるわけではありません。数値の範囲超過と、配列の領域外への書き込みは別の問題です。

🐾 PR

💻 IT現場における「オーバーフロー」とは?

メモリに関する例には、「バッファオーバーフロー」と「スタックオーバーフロー」があります。バッファオーバーフローは、プログラムが確保したメモリ領域(バッファ)を超えてデータを書き込んでしまうことで、隣接するメモリを破壊し、最悪の場合は外部から不正なコードを実行されるセキュリティ脆弱性につながります。

スタックオーバーフローは、関数呼び出しなどで使うスタックが足りなくなる状態です。終了しない再帰だけでなく、有限でも深すぎる再帰が原因になります。多くの場合は対象プロセスの異常終了などとして現れ、必ずOS全体が停止するわけではありません。

⚠️ 算術オーバーフローの仕組み

たとえば符号なし8ビット整数は0〜255を表します。255に1を足したときの扱いは、言語、型、検査設定で変わります。Cの符号なし演算は型の範囲に応じた剰余になりますが、符号付き整数の範囲超過を同じ規則だと思ってはいけません。

計算ミスが大きなバグに

「たかが1増えるだけ」と思っていても、プログラム上では「最大値から突然最小値(あるいはマイナス)になる」ため、在庫管理システムや金融システムでは致命的な計算ミスを引き起こす原因となります。

// JavaScript:通常のNumberでも整数の精度には上限がある
const max = Number.MAX_SAFE_INTEGER;
console.log(Number.isSafeInteger(max));     // true
console.log(Number.isSafeInteger(max + 1)); // false
// 正確な大きな整数が必要ならBigIntなどを検討する
console.log(9007199254740991n + 2n);

上の例はバッファの破壊ではなく、数値表現の限界を確認するものです。メモリ安全な言語でも、整数の範囲、浮動小数点の精度、再帰の深さやメモリ不足まで自動的に解決されるわけではありません。

🛠️ オーバーフローを防ぐためのポイント

安全なシステムを作るためには、データの「溢れ」を常に想定しておく必要があります。

カゴからはみ出す肉球と違い、データの「はみ出し」は種類を分けて調べる必要があります。数値なら型の範囲、配列なら添字と長さ、再帰なら呼び出しの深さを確認すると、容量を増やすだけでは直らない原因も見つけやすくなります。