Ошибка: 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