Partilhar via


Erro: memcpy-param-overlap

Endereço Sanitizer Error: memcpy-param-overlap

Observações

Note

O /Oi sinalizador é necessário para detetar memcpy-param-overlap erros de forma confiável. Este sinalizador diz ao compilador para tratar memcpy e outras funções como intrínsecas, o que é necessário porque algumas versões da biblioteca padrão implementá-los como tal. Como o ASan é uma ferramenta de análise dinâmica, ele só pode detetar erros com um efeito de tempo de execução observável. Observe que, quando /O2 também é definido, o ASan pode não ser capaz de detetar memcpy-param-overlap erros de forma confiável porque a variante intrínseca dessas funções não tem garantia de ser usada. Para obter mais informações, consulte /Oi documentos.

A função memcpy CRT não suporta memória sobreposta. O CRT fornece uma alternativa para memcpy que suporta memória sobreposta: memmove.

Um erro comum é tratar memmove como sendo semanticamente equivalente a memcpy.

Example

// 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 criar e testar este 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

Erro resultante

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

Consulte também

Visão geral do AddressSanitizer
AddressSanitizer problemas conhecidos
de compilação e referência de linguagem AddressSanitizer
de referência de tempo de execução AddressSanitizer
AddressSanitizer shadow bytes
AddressSanitizer na nuvem ou de testes distribuídos
de integração do depurador AddressSanitizer
Exemplos de erro AddressSanitizer