Udostępnij przez


Błąd: memcpy-param-overlap

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

Uwagi

Note

Flaga jest wymagana /Oi do niezawodnego wykrywania memcpy-param-overlap błędów. Ta flaga nakazuje kompilatorowi traktowanie memcpy i inne funkcje jako funkcje wewnętrzne, co jest konieczne, ponieważ niektóre wersje standardowej biblioteki implementują je jako takie. Ponieważ usługa ASan jest narzędziem do analizy dynamicznej, może wykrywać tylko błędy z widocznym efektem środowiska uruchomieniowego. Należy pamiętać, że jeśli /O2 jest również ustawiona, usługa ASan może nie być w stanie niezawodnie wykrywać memcpy-param-overlap błędów, ponieważ wewnętrzny wariant tych funkcji nie jest gwarantowany. Aby uzyskać więcej informacji, zobacz /Oi dokumentację.

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.

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

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

Wynikowy błąd

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

Zobacz także

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