分享方式:


/RTC ( 執行時間錯誤檢查 )

用來啟用和停用運行時間錯誤檢查功能,並搭配 runtime_checks pragma。

語法

/RTC1
/RTCc
/RTCs
/RTCu

引數

/RTC1
相當於 /RTCsu

/RTCc
將值指派給較小的數據類型,並導致數據遺失時報告。 例如,它會報告的型別值0x0101是否short指派給 類型的char變數。

此選項可以回報您想要截斷的情況。 例如,當您想要傳回的前8位 int 做為 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
開啟堆疊框架執行時間錯誤檢查,如下所示:

  • 將局部變數初始化為非零值。 此選項可協助識別在偵錯模式中執行時未出現的 Bug。 相較於發行組建,堆棧變數在偵錯組建中仍有零值的可能性更大。 這是因為發行組建中堆疊變數的編譯程序優化。 一旦程式使用其堆疊的區域,編譯程序永遠不會重設為 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 編譯程式選項在命令行編譯程式,則程式代碼中的任何 pragma optimize 指令會以無訊息方式失敗。 這是因為運行時間錯誤檢查在發行 (優化) 組建中無效。

用於 /RTC 開發組建;請勿 /RTC 用於發行組建。 /RTC無法與編譯程式優化搭配使用(選項(/O優化程序代碼)。 使用 /RTC 建置的程式映射稍微大一點,而且比建 /Od 置的映射稍微慢一點(最多比 /Od 建置慢 5%) 。

當您 __MSVC_RUNTIME_CHECKS 使用任何 /RTC 選項或 /GZ時,將會定義預處理器指示詞。

在 Visual Studio 開發環境中設定這個編譯器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 選取 [組態屬性>C/C++>Code 產生] 屬性頁。

  3. 修改下列其中一個或兩個屬性: 基本運行時間檢查較小的類型檢查

若要以程式方式設定這個編譯器選項

另請參閱

MSVC 編譯器選項
MSVC 編譯器命令列語法
如何:使用原生執行階段檢查