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

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

Замечания

Note

Флаг /Oi требуется для надежного обнаружения memcpy-param-overlap ошибок. Этот флаг сообщает компилятору обрабатывать memcpy и другие функции как встроенные функции, что необходимо, так как некоторые версии стандартной библиотеки реализуют их как таковые. Так как ASan — это средство динамического анализа, оно может обнаруживать только ошибки с наблюдаемым эффектом среды выполнения. Обратите внимание, что при /O2 установке ASan может не иметь возможности надежно обнаруживать memcpy-param-overlap ошибки, так как встроенный вариант этих функций не гарантируется для использования. Дополнительные сведения см. в разделе /Oi (Создание встроенных функций).

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

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

Example

// 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

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

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

См. также

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