Partager via


Avertissement du compilateur (niveau 1) C4789

la destination de la copie en mémoire est trop petite

Signale tout dépassement de mémoire tampon lors de l'utilisation de fonctions Runtime C (CRT) spécifiques, lors du passage de paramètres et lors d'assignations, afin que les tailles des données soient connues au moment de la compilation. Cet avertissement s'applique aux situations susceptibles d'être ignorées par la détection classique d'incompatibilité de la taille des données.

L'avertissement s'affiche lorsque les données, dont la longueur est connue au moment de la compilation, sont copiées et placées dans un bloc de données dont la taille est identifiée au moment de la compilation comme étant trop petite pour les données. La copie doit être effectuée à l'aide de la forme intrinsèque de l'une des fonctions CRT suivantes :

L'avertissement s'affiche également lorsqu'un type de données de paramètre est incompatible avec un cast et qu'une assignation de copie d'une référence lvalue est tentée par la suite.

Visual C++ peut générer cet avertissement pour un chemin d'accès de code qui ne s'exécute jamais. Vous pouvez désactiver temporairement l'avertissement en utilisant #pragma, comme illustré dans cet exemple :

#pragma(push)

#pragma warning ( disable : 4789 )

// unused code that generates compiler warning C4789

#pragma(pop)

Cela empêche Visual C++ de générer l'avertissement pour ce bloc de code spécifique. La directive #pragma(push) conserve l'état existant avant qu'il ne soit modifié par la directive #pragma warning(disable: 4789). La directive #pragma(pop) restaure l'état de type push et supprime les effets de la directive #pragma warning(disable:4789). Pour plus d'informations sur les directives de préprocesseur C++ #pragma, consultez warning et Directives pragma et mot clé _Pragma.

Exemple

L'exemple suivant génère l'erreur C4789.

// C4789.cpp
// compile with: /Oi /W1 /c
#include <string.h>
#include <stdio.h>

int main() 
{
    char a[20];
    strcpy(a, "0000000000000000000000000\n");   // C4789

    char buf2[20];
    memset(buf2, 'a', 21);   // C4789

    char c;
    wchar_t w = 0;
    memcpy(&c, &w, sizeof(wchar_t));
}

L'exemple suivant génère également l'erreur C4789.

// C4789b.cpp
// compile with: /W1 /O2 /c
// processor: x86
short G;

void main()
{
  int * p = (int *)&G; 
  *p = 3;   // C4789
}