Compartilhar via


Erro: memcpy-param-overlap

Erro do Address Sanitizer: memcpy-param-overlap

A função CRT memcpynã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

Captura de tela do depurador exibindo o erro memcpy-param-overlap no exemplo 1.

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