Condividi tramite


Errore: memcpy-param-overlap

Errore di sanificazione dell'indirizzo: memcpy-param-overlap

La funzione memcpyCRT non supporta la memoria sovrapposta. CRT offre un'alternativa a memcpy che supporta la memoria sovrapposta: memmove.

Un errore comune consiste nel considerare memmove come semanticamente equivalente a memcpy.

Esempio

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

Per compilare e testare questo esempio, eseguire questi comandi in un prompt dei comandi per sviluppatori di Visual Studio 2019 versione 16.9 o successiva:

cl example1.cpp /fsanitize=address /Zi /Oi
devenv /debugexe example1.exe

Il flag /Oi indica al compilatore di trattare memcpy e memmove come funzioni intrinseche. Ciò è necessario perché alcune versioni della libreria standard implementano memcpy e memmove nello stesso modo. Poiché ASAN è uno strumento di analisi dinamica, rileva solo gli errori con un effetto di runtime osservabile.

Errore risultante

Screenshot del debugger che mostra l'errore memcpy-param-overlap nell'esempio 1.

Vedi anche

Panoramica di AddressSanitizer
Problemi noti di AddressSanitizer
Riferimento alla compilazione e al linguaggio AddressSanitizer
Informazioni di riferimento sul runtime AddressSanitizer
Byte ombreggiatura AddressSanitizer
AddressSanitizer cloud o test distribuiti
Integrazione del debugger AddressSanitizer
Esempi di errore addressSanitizer