Visual Studio 2017 を使用することをお勧めします

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

 

公開日: 2016年6月

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

ランタイム エラー チェック機能を有効または無効にするために、runtime_checks プラグマと組み合わせて使用されます。

/RTC1  
/RTCc  
/RTCs  
/RTCu  

1
/RTC su と等価です。

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/Zp (構造体メンバーの配置)、または pack を使用した場合、または埋め込みを追加しなければならないような方法で構造体の要素を要求した場合に起こります。

  • スタック ポインターの検証によって、スタック ポインターの破損を検出します。 呼び出し規約の不一致によって、スタック ポインターが破損することがあります。 たとえば、関数のポインターを __cdecl として宣言したが、関数ポインターを使用して __stdcall としてエクスポートされた DLL の関数を呼び出した場合です。

u
初期化されていない変数を使用したときに報告します。 たとえば、ある命令で 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 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。

  2. [C/C++] フォルダーをクリックします。

  3. [コード生成] プロパティ ページをクリックします。

  4. [基本ランタイム チェック] プロパティと [小さい型への変換チェック] プロパティのいずれか、または両方を変更します。

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

コンパイラ オプション
コンパイラ オプションの設定
RTC sample

表示: