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