Error: memcpy-param-overlap
Error de AddressSanitizer: memcpy-param-overlap
La función memcpy
CRT no admite la memoria superpuesta. CRT proporciona una alternativa a memcpy
que sí admite la superposición de memoria: memmove
.
Un error común es tratar memmove
como si fuera equivalente semánticamente a memcpy
.
Ejemplo
// 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;
}
Para compilar y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:
cl example1.cpp /fsanitize=address /Zi /Oi
devenv /debugexe example1.exe
La marca /Oi indica al compilador que trate memcpy
y memmove
como funciones intrínsecas. Esto es necesario porque algunas versiones de la biblioteca estándar implementan memcpy
y memmove
de la misma manera. Dado que ASAN es una herramienta de análisis dinámico, solo detecta errores con un efecto observable en tiempo de ejecución.
Error resultante
Consulte también
Introducción a AddressSanitizer
Problemas conocidos de AddressSanitizer
Referencia de lenguaje y compilación de AddressSanitizer
Referencia del entorno de ejecución addressSanitizer
Bytes de sombra addressSanitizer
Pruebas distribuidas o en la nube addressSanitizer
Integración del depurador AddressSanitizer
Ejemplos de errores addressSanitizer