Erro: memcpy-param-overlap
Erro do Address Sanitizer: memcpy-param-overlap
A função CRT memcpy
não dá suporte para 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 diz 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 só detecta 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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de