Compartir a través de


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

Captura de pantalla del depurador en la que se muestra el error memcpy-param-overlap en el ejemplo 1.

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