Delen via


Fout: memcpy-param-overlap

Adres opschoningsfout: memcpy-param-overlap

De functie memcpy CRT biedt geen ondersteuning voor overlappend geheugen. De CRT biedt een alternatief voor memcpy dat ondersteuning biedt voor overlappend geheugen: memmove.

Een veelvoorkomende fout is om te behandelen memmove als semantisch equivalent aan memcpy.

Voorbeeld

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

Als u dit voorbeeld wilt bouwen en testen, voert u deze opdrachten uit in een Opdrachtprompt voor ontwikkelaars van Visual Studio 2019 versie 16.9 of hoger:

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

De vlag /Oi vertelt de compiler om intrinsieke functies te behandelen memcpy en memmove als intrinsieke functies. Dit is nodig omdat sommige versies van de standaardbibliotheek op dezelfde manier worden geïmplementeerd memcpy en memmove op dezelfde manier. Omdat ASAN een hulpprogramma voor dynamische analyse is, detecteert het alleen fouten met een waarneembaar runtime-effect.

Resulterende fout

Schermopname van het foutopsporingsprogramma met de fout 'memcpy-param-overlap' in voorbeeld 1.

Zie ook

Overzicht van AddressSanitizer
AddressSanitizer bekende problemen
AddressSanitizer-build- en taalreferenties
naslaginformatie over AddressSanitizer-runtime
addressSanitizer schaduwbytes
AddressSanitizer-cloud of gedistribueerde tests
integratie van AddressSanitizer-foutopsporingsprogramma's
voorbeelden van AddressSanitizer-fouten