前: Type Checking, 上: Checks


9.3.2 範囲チェックの概要

いくつかの言語 (例えば、 Modula-2) では、 型の上限を超えるとエラーになります。 このチェックは、 実行時に行われます。 このような範囲チェックは、 計算結果がオーバーフローしたり、 配列の要素へのアクセス時に使うインデックスが配列の上限を超えたりすることがないことを確実にすることによって、 プログラムの正しさを確かなものにすることを意図したものです。

GDBコマンドの中で使う式については、 範囲エラーの扱いを以下のいずれかにするよう GDBに指示することができます。

範囲エラーは、 数値がオーバフローした場合、 配列インデックスの上限を超えた場合、 どの型のメンバでもない定数が入力された場合に発生します。 しかし、 言語の中には、 数値のオーバフローをエラーとして扱わないものもあります。 C言語の多くの実装では、 数学的演算によるオーバフローは、 結果の値を「一巡」させて小さな値にします。 例えば、 mが整数値の最大値、 sが整数値の最小値とすると、

     m + 1 => s

になります。

これも個々の言語に固有な性質であり、 場合によっては、 個々のコンパイラやマシンに固有な性質であることもあります。 特定の言語に関する詳細については、 See Supported languages

GDBは、 範囲チェック機能を制御するためのコマンドをさらにいくつか提供しています。

set check range auto
カレントな作業言語に応じて、 範囲チェックを実行する、 または、 実行しないよう設定します。 個々の言語のデフォルトの設定については、 See Supported languages
set check range on
set check range off
カレントな作業言語のデフォルトの設定を無視して、 範囲チェックを実行する、 または、 実行しないよう設定します。 設定が言語のデフォルトとは異なる場合は、 警告メッセージが出力されます。 範囲エラーが発生した場合は、 メッセージが表示され、 式の評価は終了させられます。
set check range warn
GDBの範囲チェック機能が範囲エラーを検出した場合、 メッセージを出力し、 式の評価を試みます。 例えば、 プロセスが、 自分の所有していないメモリをアクセスした場合 (多くのUnixシステムで典型的に見られる例です) など、 他の理由によって式の評価が不可能な場合があります。
show range
範囲チェック機能のカレントな設定と、 それがGDBによって自動的に設定されているのか否かを表示します。