Ошибка: memcpy-param-overlap

Ошибка санитизатора адресов: memcpy-param-overlap

Функция memcpyCRT не поддерживает перекрываемую память. CRT предоставляет альтернативуmemcpy, которая поддерживает перекрывающуюся память: memmove

Распространенная ошибка заключается в том, чтобы рассматривать memmove как семантику эквивалентно memcpy.

Пример

// example1.cpp
// memcpy-param-overlap error
#include <string.h>

__declspec(noinline) void bad_function() {
    char buffer[] = "hello";

    memcpy(buffer, buffer + 1, 5); // BOOM!
}

int main(int argc, char **argv) {
    bad_function();
    return 0;
}

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

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

Флаг /Oi сообщает компилятору обрабатывать memcpy и memmove как встроенные функции. Это необходимо, так как некоторые версии стандартной библиотеки реализуются memcpy и memmove таким же образом. Так как ASAN — это средство динамического анализа, оно обнаруживает только ошибки с наблюдаемым эффектом среды выполнения.

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

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

См. также

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