Błąd: memcpy-param-overlap

Błąd sanitizera adresu: memcpy-param-nakładające się

Funkcja memcpyCRT nie obsługuje nakładających się pamięci. CRT stanowi alternatywę dla tej metody memcpy , która obsługuje nakładanie się pamięci: memmove.

Typowym błędem jest traktowanie memmove jako semantycznie równoważne z memcpy.

Przykład

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

Aby skompilować i przetestować ten przykład, uruchom następujące polecenia w wierszu polecenia programu Visual Studio 2019 w wersji 16.9 lub nowszej:

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

Flaga /Oi informuje kompilator o traktowaniu memcpy i memmove jako funkcjach wewnętrznych. Jest to konieczne, ponieważ niektóre wersje standardowej biblioteki implementują memcpy i memmove w ten sam sposób. Ponieważ usługa ASAN jest narzędziem analizy dynamicznej, wykrywa tylko błędy z widocznym efektem środowiska uruchomieniowego.

Wynikowy błąd

Zrzut ekranu przedstawiający debuger wyświetlający błąd memcpy-param-overlap w przykładzie 1.

Zobacz też

AddressSanitizer — omówienie
Rozwiązywanie znanych problemów z programemSanitizer
Dokumentacja języka i kompilacji narzędzia AddressSanitizer
AddressSanitizer runtime reference (Dokumentacja środowiska uruchomieniowego AddressSanitizer)
Bajty w tle addressSanitizer
AddressSanitizer — chmura lub testowanie rozproszone
Integracja debugera AddressSanitizer
Przykłady błędów addressSanitizer