/RTC (ランタイム エラー チェック)

runtime_checks プラグマとともに、ランタイム エラー チェック機能を有効または無効にするために使用します。

構文

/RTC1
/RTCc
/RTCs
/RTCu

引数

/RTC1
これは、/RTCsu に相当します。

/RTCc
より小さいデータ型に値が代入されてデータが失われる場合に報告します。 たとえば、short 型の値 0x0101char 型の変数に代入された場合に報告します。

このオプションを使用すると、切り捨ての対象となる状況を報告できます。 たとえば、int の最初の 8 ビットを char として返す場合です。 代入によって情報が失われた場合、/RTCc を使用するとランタイム エラーが発生するので、まず、ランタイム エラーを回避する必要のある情報をマスクします。 次に例を示します。

#include <crtdbg.h>

char get8bits(unsigned value, int position) {
   _ASSERT(position < 32);
   return (char)(value >> position);
   // Try the following line instead:
   // return (char)((value >> position) & 0xff);
}

int main() {
   get8bits(12341235,3);
}

/RTCc では標準に準拠するコードが拒否されるので、C++ 標準ライブラリではサポートされていません。 /RTCc と C ++ 標準ライブラリを使用するコードでは、コンパイラ エラー C1189 が発生する場合があります。 _ALLOW_RTCc_IN_STL を定義して警告をサイレント状態にし、/RTCc オプションを使用することができます。

/RTCs
スタック フレームのランタイム エラー チェックを有効にするには、次のようにします。

  • ローカル変数を 0 以外の値に初期化。 このオプションは、デバッグ モードでの実行時に、表示されないバグを特定するのに役立ちます。 リリース ビルドと比較して、デバッグ ビルドの方がスタック変数の値が 0 になる可能性が高くなります。 これは、リリース ビルドでのスタック変数のコンパイラ最適化のためです。 プログラムが使用したスタック領域が、コンパイラによって 0 にリセットされることはありません。 つまり、初期化されていないスタック変数が後で同じスタック領域を使用することになった場合に、以前そのスタック メモリが使われたときの値が残っていて、それが返される可能性があります。

  • 配列などのローカル変数のオーバーランとアンダーランの検出。 /RTCs は、構造体内のコンパイラ パディングの結果として生成されたメモリにアクセスする場合、オーバーランを検出しません。 パディングは、align/Zp (構造体メンバーの配置)、または pack を使用した場合か、コンパイラによるパディングの追加が必要になるような形で構造体要素を順序付けした場合に行われる可能性があります。

  • スタック ポインターの検証。これはスタック ポインターの破損を検出します。 スタック ポインターの破損は、呼び出し規則に不一致があることで生じる可能性があります。 たとえば、関数ポインターを使い、__stdcall としてエクスポートされる DLL 内の関数を呼び出したのに、関数へのポインターを __cdecl として宣言した場合です。

/RTCu
変数が初期化されずに使用されている場合に報告します。 たとえば、警告 C4701 を生成する命令では、/RTCu でランタイム エラーが生成される場合があります。 コンパイラの警告 (レベル 1 とレベル 4) C4700 を生成する命令では、/RTCu でランタイム エラーが生成されます。

しかし、次のコード フラグメントがあるとします。

int a, *b, c;
if ( 1 )
b = &a;
c = a;  // No run-time error with /RTCu

変数が初期化されている可能性がある場合、その変数は実行時に /RTCu によって報告されません。 たとえば、変数がポインターを介してエイリアス化されると、コンパイラはその変数を追跡せず、初期化されていない使用を報告します。 実際には、アドレスを取得して変数を初期化できます。 この場合、& 演算子は代入演算子のように動作します。

解説

ランタイム エラー チェックは、実行中のコードの問題を見つける方法です。詳細については、「方法: ネイティブ ランタイム チェックを使用する」を参照してください。

コマンド ラインでは複数の /RTC オプションを指定できます。 オプション引数は組み合わせることができます。たとえば、/RTCcu/RTCc /RTCu と同じです。

いずれかの /RTC コンパイラ オプションを使用してコマンド ラインでプログラムをコンパイルすると、コード内のプラグマ optimize 命令は警告なしで失敗します。 これは、リリース (最適化された) ビルドではランタイム エラー チェックが有効になっていないからです。

/RTC は開発ビルドに使用します。リリース ビルドには /RTC を使用しないでください。 /RTC をコンパイラ最適化 (/O オプション (コードの最適化)) とともに使用することはできません。 /RTC でビルドされたプログラム イメージは、/Od でビルドされたイメージよりも若干大きく、また若干遅くなります (/Od ビルドよりも最大 5% 遅い)。

__MSVC_RUNTIME_CHECKS プリプロセッサ ディレクティブは、/RTC オプションまたは /GZ を使用するときに定義されます。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関するページを参照してください。

  2. [構成プロパティ]>[C/C++]>[コード生成] プロパティ ページを選択します。

  3. 次のプロパティの一方または両方を変更します: [基本ランタイム チェック] または [より小さい型のチェック]

このコンパイラ オプションをコードから設定するには

関連項目

MSVC コンパイラ オプション
MSVC コンパイラ コマンド ラインの構文
方法: ネイティブ ランタイム チェックを使用する