Sig[6].Value=c0000005 // STATUS_ACCESS_VIOLATION
Sig[7].Value=00001d2a // 異常偏移地址
經典空指針解引用或野指針訪問特徵。
| 環境 | 記憶體佈局 | 未初始化變量值 | 表現 |
|---|---|---|---|
| VS Debug | 調試堆填充 0xCD/0xFD | 確定性非零 | 可能偶然正常 |
| VS Release | 優化後佈局 | 隨機垃圾值 | 不確定性崩潰 |
| 直接運行 | 標準堆 | 全零或隨機 | 穩定崩潰 |
// 代碼中添加崩潰傾印生成
#include
#pragma comment(lib, "DbgHelp.lib")
LONG WINAPI MyCrashHandler(EXCEPTION_POINTERS* pExp) {
MINIDUMP_EXCEPTION_INFORMATION mei;
mei.ThreadId = GetCurrentThreadId();
mei.ExceptionPointers = pExp;
mei.ClientPointers = FALSE;
HANDLE hFile = CreateFile(_T("crash.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mei, NULL, NULL);
CloseHandle(hFile);
return EXCEPTION_EXECUTE_HANDLER;
}
// 程序入口設置
SetUnhandledExceptionFilter(MyCrashHandler);
Create() 返回值檢查// 悪習
CString str; // 未初始化
int* p = new int; // 未初始化
// 好習慣
CString str = _T("");
int* p = new int(0);
int arr[10] = {0};
項目屬性 → C/C++ → General → Enable Address Sanitizer: Yes
// 錯誤代碼
void CMyDialog::OnButtonClick() {
CRect rect; // 未初始化!
GetClientRect(&rect); // 輸出參數,但若函數失敗 rect 含垃圾值
// 後續使用 rect 導致崩潰
}
// 正確代碼
void CMyDialog::OnButtonClick() {
CRect rect = {0}; // 零初始化
if (GetClientRect(&rect)) {
// 安全使用
}
}