エラー: 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
フラグが必要です。
結果のエラー
例 - スレッド上のスタック アンダーフロー
// 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 エラーの例