Sdílet prostřednictvím


Chyba: memcpy-param-overlap

Chyba sanitizátoru adresy: memcpy-param-overlap

Funkce memcpy CRT nepodporuje překrývající se paměť. CRT poskytuje alternativu memcpy k tomu, že podporuje překrývající se paměť: memmove.

Běžnou chybou je považovat za memmove sémanticky ekvivalentní memcpy.

Příklad

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

Pokud chcete tento příklad sestavit a otestovat, spusťte tyto příkazy v sadě Visual Studio 2019 verze 16.9 nebo novějším vývojářském příkazovém řádku:

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

Příznak /Oi říká kompilátoru, aby s nimi zacházel memcpy a memmove jako vnitřní funkce. To je nezbytné, protože některé verze standardní knihovny implementují memcpy a memmove stejným způsobem. Vzhledem k tomu, že ASAN je nástroj pro dynamickou analýzu, detekuje pouze chyby s pozorovatelným efektem za běhu.

Výsledná chyba

Snímek obrazovky ladicího programu zobrazující chybu memcpy-param-overlap v příkladu 1

Viz také

Přehled AddressSanitizer
Známé problémy s addressSanitizerem
Referenční dokumentace k sestavení a jazyku AddressSanitizer
Referenční informace k modulu runtime AddressSanitizer
Stínové bajty AddressSanitizer
AddressSanitizer – cloud nebo distribuované testování
Integrace ladicího programu AddressSanitizer
Příklady chyb AddressSanitizer