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