Błąd: memcpy-param-overlap
Błąd sanitizera adresu: memcpy-param-nakładające się
Funkcja memcpy
CRT 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
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
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla