/RTC (ランタイム エラー チェック)
更新 : 2007 年 11 月
ランタイム エラー チェック機能を有効または無効にするために、runtime_checks プラグマと組み合わせて使用されます。
/RTC1
/RTCc
/RTCs
/RTCu
引数
1
/RTCsu と等価です。c
より小さいデータ型に値が代入されてデータが失われる場合に報告します。たとえば、short 0x101 型の値を char 型の変数に代入する場合です。このオプションは、たとえば int の先頭 8 ビットを char 型として返す場合のように、切り捨てを予定している場合に報告します。代入の結果、情報が失われる場合は、/RTCc によってランタイム エラーが生じます。/RTCc がランタイム エラーを起こさないようにするには、必要な情報にマスクを設定します。たとえば、次のようにします。
#include <crtdbg.h> char get8bits(int 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); }
s
スタック フレームのランタイム エラー チェックを次のようにして有効にします。ローカル変数をゼロ以外の値に初期化します。これはデバッグ モードでの実行中に出現しないバグを識別するのに役立ちます。リリース ビルドでは、スタック変数のコンパイラ最適化が指定されているため、デバッグ ビルドではリリース ビルドよりもスタック変数がゼロに設定されたままになっている可能性が高くなります。いったんスタックの領域がプログラムによって使用されると、コンパイラによって 0 にリセットされることはありません。したがって、後続の初期化されていないスタック変数が同じスタック領域を使用すると、前回のスタック メモリの使用から残されていた値が返される可能性があります。
配列などのローカル変数のオーバーランおよびアンダーランを検出します。構造体へのコンパイラの埋め込みによってオーバーランが生じた場合、/RTCs は、メモリ アクセス時にオーバーランを検出しません。埋め込みは、align (C++)、/Zp (構造体メンバの配置)、または pack を使用した場合、または埋め込みを追加しなければならないような方法で構造体の要素を要求した場合に起こります。
スタック ポインタの検証によって、スタック ポインタの破損を検出します。呼び出し規約の不一致によって、スタック ポインタが破損することがあります。たとえば、関数のポインタを __cdecl として宣言したが、関数ポインタを使用して __stdcall としてエクスポートされた DLL の関数を呼び出した場合です。
u
初期化されていない変数を使用したときに報告します。たとえば、ある命令で コンパイラの警告 (レベル 4) C4701 が生成されると、/RTCu でランタイム エラーが生成されることがあります。コンパイラの警告 (レベル 1 およびレベル 4) C4700 を生成した命令はすべて /RTCu でランタイム エラーを生成します。ただし、次のコードのような場合もあります。
int a, *b, c; if ( 1 ) b = &a; c = a; // No run-time error with /RTCu
変数が初期化された場合、/RTCu からランタイム エラーは報告されません。たとえば、ポインタを使って変数にエイリアスが設定されている場合、コンパイラは変数を追跡しないため、変数が初期化されずに使用されても報告しません。事実上、変数のアドレスを取ることで、その変数を初期化できます。この場合、& 演算子は代入演算子のような働きをします。
解説
ランタイム エラー チェックは、実行中のコードの問題を見つけるための方法です。詳細については、「方法 : ネイティブ ランタイム チェックを使用する」を参照してください。
いずれかの /RTC コンパイラ オプションを使ってコマンド ラインでプログラムをコンパイルすると、コードのすべてのプラグマ optimize 命令は失敗します。これは、リリース (最適化) ビルドではランタイム エラー チェックが無効になるためです。
開発ビルドでは /RTC を使用する必要があります。リリース ビルドでは /RTC を使用しないでください。/RTC は、コンパイラの最適化機能 (/O オプション (コードの最適化)) とは併用できません。/RTC を指定してビルドされたプログラム イメージは、/Od でビルドされたイメージよりもわずかに大きく、またわずかに遅くなります (/Od ビルドよりも最大 5% 遅くなります)。
/RTC オプションまたは /GZ を使用すると、__MSVC_RUNTIME_CHECKS プリプロセッサ ディレクティブが定義されます。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[C/C++] フォルダをクリックします。
[コード生成] プロパティ ページをクリックします。
[基本ランタイム チェック] プロパティと [小さい型への変換チェック] プロパティのいずれか、または両方を変更します。
このコンパイラ オプションをコードから設定するには
- BasicRuntimeChecks プロパティおよび SmallerTypeCheck プロパティを参照してください。
スマート デバイス開発者のためのメモ
デバイス コンパイラの場合、RTC 機能がサポートされているのは x86 だけで、Visual Studio IDE の Visual C++ デバイス プロジェクトのプロパティ設定としては公開されていません。ただし、x86 を対象としている場合は、このオプションを、[C/C++ コマンド ライン] プロパティ ページの [追加のオプション] ペインで IDE に設定できます。