CodeGuard** 是 C++ Builder 5/6 內建的**運行期錯誤偵測引擎**,能在程式執行時即時攔截記憶體洩漏、無效指標存取、雙重釋放、緩衝區溢位、API 參數錯誤、資源洩漏等經典 C/C++ 錯誤。本文詳細說明啟用設定、配置工具、日誌分析、常見錯誤類型與實戰除錯流程。
命令列執行 `cgconfig.exe` 開啟圖形介面,四大分頁:
| 分頁 | 核心功能 |
|---|---|
| Preferences | 全域啟用/停用、堆疊填充頻率、報告模式 (檔案/MessageBox)、統計資訊輸出 |
| Resource Options | 各類資源 (記憶體、GDI、USER、Kernel、檔案) 的追蹤等級 (Off/Allocate/Free/All) |
| Function Options | 特定 API 的參數驗證、回傳值檢查、呼叫堆疊記錄 |
| Ignored Modules | 排除特定 DLL/BPL 不受監控 (如第三方無原始碼模組) |
設定儲存於專案目錄 `cg32.cfg`,隨專案分發。
| 錯誤類型 | 典型程式碼 | 說明 |
|---|---|---|
| Access In Freed Memory | `delete p; p->foo();` | 記憶體釋放後仍讀寫 |
| Method Called On Freed Object | `delete obj; obj->Method();` | 物件銷毀後呼叫成員函數 |
| Reference To Freed Resource | `delete p; delete p;` | 雙重釋放同一資源 |
| Method Called On Illegally Casted Object | `Arr[5].Method();` (size=5) | 越界存取並呼叫方法 |
| Resource Type Mismatch | `new T[2]; delete p;` (應 `delete[]`) | 配置/釋放運算子不配對 |
| Access Overrun | `char buf[5]; strcpy(buf, "123456");` | 寫入超出配置範圍 (緩衝區溢位) |
| Access Underrun | `arr[-1] = 0;` | 寫入配置範圍前方 |
| Uninitialized Stack Accessing | `int* p; foo(&p); *p=1;` (foo 未初始化) | 使用未初始化的堆疊變數 |
| Access In Invalid Stack | `strcpy(&str[-1], "x");` | 存取堆疊保護區/紅區 |
| Bad Parameter | `fclose(nullptr);` | 傳遞無效 Handle/指標給 API |
| Function Failure | `CopyFile(...)` 失敗未檢查 | API 回傳失敗碼被 CodeGuard 攔截 |
| Resource Leak | `new char[100];` 結束未 `delete[]` | 程式結束時偵測到未釋放資源 |
CodeGuard 是 C++ Builder 時代最強大的內建除錯利器,透過「編譯期插桿 + 運行期攔截 + 視覺化日誌」三位一體設計,能快速定位 90% 以上的記憶體與資源管理錯誤。掌握其啟用、配置、日誌分析與十二大錯誤類型,配合現代 Sanitizer 工具鏈,即可建立從開發到上線的完整記憶體安全防線。