錯誤: stack-buffer-underflow
位址清理程式錯誤:堆疊緩衝區下溢
這些錯誤訊息表示在堆疊變數開頭之前對某處的記憶體存取。
範例 - 本機陣列下溢
// example1.cpp
// stack-buffer-underflow error
#include <stdio.h>
int main() {
int subscript = -1;
char buffer[42];
buffer[subscript] = 42; // Boom!
return 0;
}
若要建置及測試此範例,請在Visual Studio 2019 16.9版或更新版本的 開發人員命令提示字元中執行下列命令:
cl example1.cpp /fsanitize=address /Zi /Od
devenv /debugexe example1.exe
ASAN 是一種動態分析形式,這表示它只能偵測實際執行錯誤的程序代碼。 優化器將會移除 指派給 buffer[subscript]
,因為 buffer[subscript]
永遠不會讀取。 因此,此範例需要 /Od
旗標。
產生的錯誤
範例 - 線程上的堆疊下溢
// example2.cpp
// stack-buffer-underflow error
#include <windows.h>
DWORD WINAPI thread_proc(void *) {
int subscript = -1;
volatile char stack_buffer[42];
stack_buffer[subscript] = 42;
return 0;
}
int main() {
HANDLE thr = CreateThread(NULL, 0, thread_proc, NULL, 0, NULL);
if (thr == 0) return 0;
WaitForSingleObject(thr, INFINITE);
return 0;
}
若要建置及測試此範例,請在Visual Studio 2019 16.9版或更新版本的 開發人員命令提示字元中執行下列命令:
cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe
產生的錯誤 - 線程上的堆疊下溢
另請參閱
AddressSanitizer 概觀
AddressSanitizer 已知問題
AddressSanitizer 組建和語言參考
AddressSanitizer 運行時間參考
AddressSanitizer 陰影位元組
AddressSanitizer 雲端或分散式測試
AddressSanitizer 調試程式整合
AddressSanitizer 錯誤範例