分享方式:


錯誤: 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 旗標。

產生的錯誤

顯示範例 1 中堆疊緩衝區下溢錯誤的調試程序螢幕快照。

範例 - 線程上的堆疊下溢

// 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

產生的錯誤 - 線程上的堆疊下溢

顯示範例 2 中堆疊緩衝區下溢錯誤的調試程序螢幕快照。

另請參閱

AddressSanitizer 概觀
AddressSanitizer 已知問題
AddressSanitizer 組建和語言參考
AddressSanitizer 運行時間參考
AddressSanitizer 陰影位元組
AddressSanitizer 雲端或分散式測試
AddressSanitizer 調試程式整合
AddressSanitizer 錯誤範例