/RTC (執行階段錯誤檢查)
結合 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 將不會偵測滿溢。 填補是透過使用 對齊 (C++)、/Zp (結構成員對齊) 或 pack 而發生,或者是您排列結構項目的方式,導致需要編譯器加入填補。
偵測堆疊指標損毀的堆疊指標驗證。 堆疊指標損毀可能由於呼叫慣例不符合造成。 例如,您使用函式指標呼叫 DLL 中匯出為 __stdcall 函式,但是您向這個函式宣告指標為 __cdecl。
u
當變數未經初始化就被使用時發出報告。 例如,會產生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 開發環境中設定這個編譯器選項
開啟專案的 [屬性頁] 對話方塊。 如需詳細資訊,請參閱 HOW TO:開啟專案屬性頁。
按一下 [C/C++] 資料夾。
按一下 [程式碼產生] 屬性頁。
修改下列一項屬性或兩者都修改:[基礎執行階段檢查] 或 [較小型別檢查]。
若要以程式方式設定這個編譯器選項
- 請參閱 BasicRuntimeChecks 和 SmallerTypeCheck 屬性。