/ RTC(運行時錯誤檢查)

用於啓用和禁用運行時錯誤檢查功能,以及runtime_checks編譯指示。

句法
複製

/RTC1
/RTCc
/RTCs
/RTCu
爭論
1
等效於/ RTCsu。

c
報告何時將值分配給較小的數據類型並導致數據丟失。例如,如果將type的值short 0x101分配給type的變量char。

此選項報告您打算截斷的情況,例如,如果您希望將a的前八位int作爲a返回char。由於/ RTCc如果分配導致任何信息丟失都會導致運行時錯誤,因此您可以屏蔽掉所需信息,以避免/ RTC導致運行時錯誤c。例如:

複製

#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);
}

啓用堆棧幀運行時錯誤檢查,如下所示:

將局部變量初始化爲非零值。這有助於確定在調試模式下運行時不會出現的錯誤。與發行版本相比,調試版本中的堆棧變量仍爲零的可能性更大,這是因爲發行版本中的編譯器對堆棧變量進行了優化。一旦程序使用了其堆棧的某個區域,編譯器就永遠不會將其重置爲0。因此,碰巧使用相同堆棧區域的後續未初始化堆棧變量可以返回該堆棧存儲器先前使用後剩餘的值。

檢測局部變量(例如數組)的超限和不足。當訪問結構中編譯器填充產生的內存時,/ RTCs將不會檢測到溢出。可以通過使用align,/ Zp(Struct Member Alignment)或pack來填充,或者如果您以要求編譯器添加填充的方式對結構元素進行排序,則可能會發生填充。

堆棧指針驗證,用於檢測堆棧指針損壞。調用約定不匹配可能導致堆棧指針損壞。例如,使用函數指針,您在導出爲__stdcall的DLL中調用函數,但是將指向該函數的指針聲明爲__cdecl。

u
報告何時使用變量而未初始化。例如,生成的指令C4701還可能在/ RTC下生成運行時錯誤u。任何生成編譯器警告(級別1和級別4)C4700的指令都將在/ RTC下生成運行時錯誤u。

但是,請考慮以下代碼片段:

C ++複製

int a, *b, c;
if ( 1 )
b = &a;
c = a;  // No run-time error with /RTCu
如果可以初始化變量,則/ RTC不會在運行時報告該變量u。例如,在變量通過指針別名後,編譯器將不會跟蹤該變量並報告未初始化的使用。實際上,您可以通過獲取變量的地址來對其進行初始化。在這種情況下,&運算符的工作方式類似於賦值運算符。

備註
運行時錯誤檢查是您在正在運行的代碼中查找問題的一種方法;有關更多信息,請參見如何:使用本機運行時檢查。

如果使用/ RTC編譯器選項中的任何一個在命令行中編譯程序,則代碼中的任何編譯指示優化指令都將無提示地失敗。這是因爲運行時錯誤檢查在發行版(優化)版本中無效。

您應該使用/ RTC進行開發;/ RTC不應用於零售版本。/ RTC不能與編譯器優化一起使用(/ O選項(優化代碼))。用/ RTC構建的程序映像將比用/ Od構建的映像稍大一些,也稍慢一些(比/ Od構建最慢5%)。

當您使用任何/ RTC選項或/ GZ時,將定義__MSVC_RUNTIME_CHECKS預處理程序指令。

在Visual Studio開發環境中設置此編譯器選項
打開項目的“ 屬性頁”對話框。有關詳細信息,請參見在Visual Studio中設置C ++編譯器和構建屬性。

單擊C / C ++文件夾。

單擊代碼生成屬性頁。

修改以下一個或兩個屬性:基本運行時檢查或較小類型檢查。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章