Erro: memcpy-param-overlap
Erro do Address Sanitizer: memcpy-param-overlap
A função memcpy
CRT não dá suporte à memória sobreposta. O CRT fornece uma alternativa à memcpy
que dá suporte para memória sobreposta: memmove
.
Um erro comum é tratar memmove
como sendo semanticamente equivalente a memcpy
.
Exemplo
// 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;
}
Para compilar e testar esse exemplo, execute estes comandos em um prompt de comando do desenvolvedor do Visual Studio 2019 versão 16.9 ou posterior:
cl example1.cpp /fsanitize=address /Zi /Oi
devenv /debugexe example1.exe
O sinalizador /Oi informa ao compilador para tratar memcpy
e memmove
como funções intrínsecas. Isso é necessário porque algumas versões da biblioteca padrão implementam memcpy
e memmove
da mesma maneira. Como o ASAN é uma ferramenta de análise dinâmica, ele detecta apenas erros com um efeito de tempo de execução observável.
Erro resultante
Confira também
Visão geral do AddressSanitizer
Problemas conhecidos do AddressSanitizer
Referência de linguagem e build do AddressSanitizer
Referência de runtime do AddressSanitizer
Bytes de sombra de AddressSanitizer
Nuvem do AddressSanitizer ou teste distribuído
Integração do depurador do AddressSanitizer
Exemplos de erro do AddressSanitizer