Visual C++ 編譯器與 C 運行庫 (CRT) 提供兩套互補的安全性檢查機制:
cl /O2 /ML /GS /EHsc GS-RTC.cpp // 優化版,發布配置
void Test1() {
char buffer1[100];
for (int i = 0; i < 200; ++i) buffer1[i] = 'a'; // 溢出 100 位元組
buffer1[sizeof(buffer1)-1] = 0;
std::cout << buffer1 << std::endl;
}
/GS 啟用:偵測到 Cookie 損毀,彈出「緩衝區溢位」錯誤對話框,程式安全終止。
/GS 關閉:返回位址被覆蓋為 0x61616161,程式崩潰或被劫持執行任意代碼。


僅用於偵錯版 (/Od 關閉優化),不可用於發布版。支援自訂錯誤處理常式,整合 Visual Studio 偵錯器中斷。
__stdcall vs __cdecl)。0xCCCCCCCC。int → unsigned char),若高位非零則報錯。ch = (value & 0xFF)。cl /Od /MLd /ZI /EHsc /RTCs GS-RTC.cpp // 啟用 /RTCs
cl /Od /MLd /ZI /EHsc /RTCu GS-RTC.cpp // 啟用 /RTCu
cl /Od /MLd /ZI /EHsc /RTCc GS-RTC.cpp // 啟用 /RTCc
| 測試 | 代碼行為 | 普通編譯 | /GS | /RTCs | /RTCu | /RTCc | |
|---|---|---|---|---|---|---|---|
| 1 | 迴圈覆蓋 buffer1[100] 200 次 (覆蓋返回位址) | 崩潰/被攻擊 | ✅ 偵測終止 | ✅ 偵測 | - | - | |
| 2 | buffer2 溢出 1 字元覆蓋 buffer1 終止符 | buffer1 顯示亂碼 | ❌ 未偵測 | ✅ 偵測堆疊損壞 | - | - | |
| 3 | 寫入 buffer1[-1] 破壞 buffer2 終止符 | buffer2 顯示雙倍長度 | ❌ 未偵測 | ✅ 偵測下溢 | - | - | |
| 4 | 使用未初始化 unsigned int | 隨機值 | - | - | ✅ 顯示 0xCCCCCCCC | - | |
| 5 | char = (char)300 (截斷) | 靜默截斷為 44 | - | - | - | ✅ 偵測資料遺失 | |
| 6.1 | 指標間接使用未初始化變數 | 隨機值 | - | - | ❌ 未偵測 (限制) | - | |
| 6.2 | 直接使用未初始化變數 | 隨機值 | - | - | - | ✅ 偵測 | - |
| 6.3 | 已初始化變數 | 正常 | - | - | - | 無錯誤 | - |
VC++ 的 /GS 與 /RTC 為 C/C++ 固有的記憶體不安全特性提供了強有力的編譯器與運行時層面防護。正確配置與理解其邊界,是構建健壯 Windows 應用的必修課。