/RTC (執行階段錯誤檢查)

更新:2007 年 11 月

結合 runtime_checks pragma,用來啟用及停用執行階段錯誤檢查功能。

/RTC1
/RTCc
/RTCs
/RTCu

引數

  • 1
    相當於 /RTCsu。

  • c
    將值指派給較小資料型別,而造成資料損失時,就會發出報告。例如,如果型別 short 0x101 的值指派給型別 char 的變數。

    這個選項將會報告您意圖截斷的情況,例如,您要將 int 的前八個位元傳回做為 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
    啟用堆疊框架 (Stack Frame) 執行階段錯誤檢查,如下所示:

    • 區域變數初始化成為非零值,這可以協助找出在偵錯模式中執行時不會出現的錯誤。與發行組建相比,偵錯組建中的堆疊變數有很大的可能仍然是零,因為在發行組建 (Build) 中編譯器會將堆疊變數最佳化。一旦程式使用了堆疊的某一區域之後,它永遠不會被編譯器重設為零。因此,後續未初始化的堆疊變數碰巧也使用相同的堆疊區域時,就可能會傳回先前使用這個堆疊記憶體時遺留下來的值。

    • 偵測滿溢和區域變數 (例如,陣列) 滿溢的情形。存取在結構內因編譯器填補而產生的記憶體時,/RTCs 不會偵測滿溢情形。填補是透過使用 align (C++)/Zp (結構成員對齊)pack 而發生,或者是您排列結構項目的方式,導致需要編譯器加入填補。

    • 偵測堆疊指標損毀的堆疊指標驗證。堆疊指標損毀可能由於呼叫慣例不符合造成。例如,您使用函式指標呼叫 DLL 中匯出為 __stdcall 函式,但是您向這個函式宣告指標為 __cdecl

  • 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 加以報告。例如,當一個變數經由指標賦予別名之後,編譯器就不會再追蹤這個變數也不會報告它未經初始化的使用情況。實際上,您可以藉由利用其位址來初始化某一變數。& 運算子在這種情況下的作用就像是指派運算子。

備註

執行階段錯誤檢查是讓您在執行程式碼時找出問題的一種方式;如需詳細資訊,請參閱 HOW TO:使用原生執行階段檢查

如果您使用任何 /RTC 編譯器選項在命令列編譯您的程式,那麼在您程式碼中的任何 Pragma optimize 指令都會失敗,而且不會出現訊息,這是因為執行階段錯誤檢查在發行 (已最佳化的) 組建中無效。

您應該將 /RTC 用於開發組建,/RTC 不可用於正式版本組建。/RTC 無法搭配編譯器最佳化 (/O 選項 (最佳化程式碼)) 使用。用 /RTC 建置的程式影像會比用 /Od 建置的程式影像稍微大一點,也稍微慢一點 (最多會比 /Od 組建慢百分之五)。

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

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

  1. 開啟專案的 [屬性頁] 對話方塊。如需詳細資訊,請參閱 HOW TO:開啟專案屬性頁

  2. 按一下 [C/C++] 資料夾。

  3. 按一下 [程式碼產生] 屬性頁。

  4. 修改下列一項屬性或兩者都修改:[基礎執行階段檢查] 或 [較小型別檢查]。

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

智慧型裝置開發人員注意事項

對裝置編譯器來說,RTC 功能只在 x86 上支援,而且不是公開為 Visual Studio IDE 中 Visual C++ 裝置專案的屬性設定值。然而,如果您的目標是 x86,就可以在 [ C/C++ 命令列] 屬性頁 [其他選項] 窗格中的 IDE 中設定這個選項。

請參閱

工作

RTC 範例:執行階段錯誤檢查

參考

編譯器選項

設定編譯器選項