Ошибка: memcpy-param-overlap
Ошибка санитизатора адресов: memcpy-param-overlap
Функция memcpy
CRT не поддерживает перекрываемую память. 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 — это средство динамического анализа, оно обнаруживает только ошибки с наблюдаемым эффектом среды выполнения.
Результирующая ошибка
См. также
Обзор AddressSanitizer
Известные проблемы AddressSanitizer
Справочник по сборке и языку AddressSanitizer
Справочник по среде выполнения AddressSanitizer
Теневой байт AddressSanitizer
Облачное или распределенное тестирование AddressSanitizer
Интеграция отладчика AddressSanitizer
Примеры ошибок AddressSanitizer