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


Ошибка: heap-buffer-overflow

Ошибка санитизатора адресов: переполнение буфера кучи

В этом примере показано сообщение об ошибке, которая приводит к возникновению доступа к памяти за пределами границ выделенного кучи объекта.

Пример : классический буфер кучи переполнения

// example1.cpp
// heap-buffer-overflow error
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {

    char *x = (char*)malloc(10 * sizeof(char));
    memset(x, 0, 10);
    int res = x[argc * 10];  // Boom!

    free(x);
    return res;
}

Чтобы создать и проверить этот пример, выполните следующие команды в командной строке разработчика Visual Studio 2019 версии 16.9 или более поздней:

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

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

Снимок экрана: отладчик, отображающий ошибку кучи-буфера-переполнения в примере 1.

Пример — неправильное приведение вниз

// example2.cpp
// heap-buffer-overflow error
class Parent {
public:
    int field;
};

class Child : public Parent {
public:
    int extra_field;
};

int main(void) {
    Parent *p = new Parent;
    Child *c = (Child*)p;  // Intentional error here!
    c->extra_field = 42;

    return 0;
}

Чтобы создать и проверить этот пример, выполните следующие команды в командной строке разработчика Visual Studio 2019 версии 16.9 или более поздней:

cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe

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

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

Пример: strncpy в кучу

// example3.cpp
// heap-buffer-overflow error
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv) {

    char *hello = (char*)malloc(6);
    strcpy(hello, "hello");

    char *short_buffer = (char*)malloc(9);
    strncpy(short_buffer, hello, 10);  // Boom!

    return short_buffer[8];
}

Чтобы создать и проверить этот пример, выполните следующие команды в командной строке разработчика Visual Studio 2019 версии 16.9 или более поздней:

cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe

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

Снимок экрана: отладчик, отображающий ошибку кучи-буфера-переполнения в примере 3.

См. также

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