Partager via


Erreur : memcpy-param-overlap

Erreur d’assainissement de l’adresse : memcpy-param-chevauchement

La fonction memcpy CRT ne prend pas en charge le chevauchement de la mémoire. Le CRT offre une alternative à memcpy celle qui prend en charge la mémoire qui se chevauche : memmove.

Une erreur courante consiste à traiter memmove comme étant sémantiquement équivalent à memcpy.

Exemple

// 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;
}

Pour générer et tester cet exemple, exécutez ces commandes dans une invite de commandes développeur Visual Studio 2019 version 16.9 ou ultérieure :

cl example1.cpp /fsanitize=address /Zi /Oi
devenv /debugexe example1.exe

L’indicateur /Oi indique au compilateur de traiter memcpy et memmove de servir de fonctions intrinsèques. Cela est nécessaire, car certaines versions de la bibliothèque standard implémentent memcpy et memmove de la même façon. Comme ASAN est un outil d’analyse dynamique, il détecte uniquement les erreurs avec un effet d’exécution observable.

Erreur résultante

Capture d’écran du débogueur affichant l’erreur memcpy-param-chevauchement dans l’exemple 1.

Voir aussi

Vue d’ensemble de AddressSanitizer
Résoudre les problèmes connus liés à AddressSanitizer
Référence de build et de langage AddressSanitizer
Informations de référence sur le runtime AddressSanitizer
Octets d’ombre AddressSanitizer
Test cloud ou distribué AddressSanitizer
Intégration du débogueur AddressSanitizer
Exemples d’erreur AddressSanitizer