次の方法で共有


エラー: stack-buffer-underflow

Address Sanitizer のエラー: スタック バッファー アンダーフロー

これらのエラー メッセージは、スタック変数の先頭より前のどこかへのメモリ アクセスを示します。

例 - ローカル配列のアンダーフロー

// 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 エラーの例