Avertissement du compilateur (niveau 1) C4789

la mémoire tampon 'identificateur' de taille N octets sera dépassé ; Les octets M sont écrits à partir du décalage L

Notes

C4789 avertit les dépassements de mémoire tampon lorsque des fonctions CRT (Runtime-Time) C spécifiques sont utilisées. Il peut également signaler des incompatibilités de taille lorsque des paramètres sont passés ou des affectations sont effectuées. L’avertissement est possible si les tailles de données sont connues au moment de la compilation. Cet avertissement s'applique aux situations susceptibles d'échapper à la détection standard des non-correspondances de tailles de données.

C4789 avertit lorsque les données sont copiées dans un bloc de données connu pour être trop petit au moment de la compilation.

L’avertissement se produit si la copie utilise la forme intrinsèque de l’une de ces fonctions CRT :

L’avertissement s’affiche également lorsque vous cassez un paramètre en type de données plus volumineux, puis effectuez une affectation de copie à partir d’une référence lvalue.

Visual C++ peut générer cet avertissement pour un chemin de code qui n’est jamais exécuté. Vous pouvez désactiver temporairement l'avertissement à l'aide de #pragma, comme illustré dans l'exemple suivant :

#pragma warning( push )
#pragma warning( disable : 4789 )
// unused code that generates compiler warning C4789`
#pragma warning( pop )

Cet idiome empêche Visual C++ de générer l’avertissement pour ce bloc de code spécifique. #pragma warning(push) conserve l'état existant avant que #pragma warning(disable: 4789) le modifie. #pragma warning(pop) restaure l'état de type push et supprime les effets de #pragma warning(disable:4789). Pour plus d’informations sur la directive #pragmade préprocesseur C++, consultez warning les directives Pragma et le __Pragma mot clé.

L’option /sdl du compilateur (Activer des vérifications de sécurité supplémentaires) élève cet avertissement à une erreur.

Exemples

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;

int main()
{
   int * p = (int *)&G;
   *p = 3;   // C4789 - writes an int through a pointer to short
}