Delen via


Fout: memcpy-param-overlap

Adres opschoningsfout: memcpy-param-overlap

Opmerkingen

Note

De /Oi vlag is vereist om fouten betrouwbaar te detecteren memcpy-param-overlap . Deze vlag vertelt de compiler dat deze als intrinsiek moet worden behandeld memcpy en andere functies, wat nodig is omdat sommige versies van de standaardbibliotheek ze als zodanig implementeren. Omdat ASan een hulpprogramma voor dynamische analyse is, kunnen alleen fouten worden gedetecteerd met een waarneembaar runtime-effect. Houd er rekening mee dat wanneer /O2 ook is ingesteld, ASan mogelijk niet betrouwbaar fouten kan detecteren memcpy-param-overlap omdat de intrinsieke variant van deze functies niet gegarandeerd kan worden gebruikt. Zie documenten voor meer informatie/Oi.

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.

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

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

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