-qcheck

説明

特定タイプのランタイム検査を実行するコードを生成する。 違反が検出された場合は、SIGTRAP シグナルをプロセスに送信することにより、ランタイム例外が出されます。

構文

構文図を読む構文図をスキップする        .-nocheck-------------------------.
>>- -q--+-check--+----------------------+-+--------------------><
                 |    .-:-------------. |
                 |    V               | |
                 '-=----+-all-------+-+-'
                        +-nullptr---+
                        +-nonullptr-+
                        +-bounds----+
                        +-nobounds--+
                        +-divzero---+
                        '-nodivzero-'
 

ここで、

all 後続のサブオプションをすべてオンに切り替えます。all オプションは、 フィルターとして他の 1 つ以上のオプションの no... 形式と共に使用することができます。

例えば、以下を使用すると、

xlc++ myprogram.C -qcheck=all:nonullptr

ストレージの参照に使用するポインター変数に含まれるアドレスを除いて、 すべての検査が行われます。

no... 形式のオプションとともに all を使用する場合は、 all は最初のサブオプションでなければなりません。

[no]nullptr ストレージの参照に使用するポインター変数に含まれるアドレスのランタイム検査を行います。 アドレスは、使用する位置で検査されます。 値が 512 より小さい場合は、トラップが起こります。
[no]bounds サイズが既知のオブジェクト内の添え字を指定するときに、アドレスのランタイム検査を行います。 指標が検査され、結果がオブジェクトのストレージの境界内のアドレスになることが確認されます。 アドレスがオブジェクトの境界内にない場合は、トラップが起こります。

このサブオプションは可変長配列へのアクセスには無効です。

[no]divzero 整数除算のランタイム検査を行います。 ゼロ除算を試行すると、トラップが発生します。

#pragma optionsも参照してください。

-qcheck オプションには前述のように幾つかのサブオプションがあります。複数のサブオプション を使用する場合は、コロン (:) でそれぞれを区切ってください。

サブオプションなし、および -qcheck のほかのバリエーションなしでコマンド行に -qcheck を指定すると、すべてのサブオプションがオンになります。

-qcheck オプションをサブオプションと共に使用すると、no プレフィックスがない場合は指定されたサブオプションがオンになり、no プレフィックスがある場合はオフになります。

-qcheck オプションは、複数回指定することができます。サブオプションの設定は累積されますが、後の方サブオプションによって前の方サブオプションがオーバーライドされます。

-qcheck オプションは、 アプリケーションのランタイム・パフォーマンスに影響を及ぼします。検査を有効にすると、 ランタイム検査がアプリケーションに挿入されるため、実行が遅くなる場合があります。

  1. -qcheck=nullptr:bounds の場合:

    void func1(int* p) {
      *p = 42;             /* Traps if p is a null pointer */
    }
     
    void func2(int i) {
      int array[10];
      array[i] = 42;     /* Traps if i is outside range 0 - 9 */
    }
  2. -qcheck=divzero の場合:

    void func3(int a, int b) {
      a / b;            /* Traps if b=0  */
    }

関連情報