Поделиться через


Ошибка: 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 флаг.

Результирующая ошибка

Снимок экрана: отладчик, отображающий ошибку stack-buffer-underflow в примере 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

Результирующая ошибка — поток стека в потоке

Снимок экрана: отладчик, отображающий ошибку stack-buffer-underflow в примере 2.

См. также

Обзор AddressSanitizer
Известные проблемы AddressSanitizer
Справочник по сборке и языку AddressSanitizer
Справочник по среде выполнения AddressSanitizer
Теневой байт AddressSanitizer
Облачное или распределенное тестирование AddressSanitizer
Интеграция отладчика AddressSanitizer
Примеры ошибок AddressSanitizer