Compilerwarnung (Ebene 1) C4789

Der Puffer "Bezeichner" von Größe N Bytes wird überlaufen; M Bytes werden ab Offset L geschrieben

Hinweise

C4789 warnt über Pufferüberläufe, wenn bestimmte C-Laufzeitfunktionen (CRT) verwendet werden. Sie kann auch Größenkonflikten melden, wenn Parameter übergeben oder Zuordnungen vorgenommen werden. Die Warnung ist möglich, wenn die Datengrößen zur Kompilierungszeit bekannt sind. Diese Warnung gilt für Situationen, in denen die typische Datengrößen-Konflikterkennung umgangen wird.

C4789 warnt, wenn Daten in einen Datenblock kopiert werden, der zur Kompilierungszeit zu klein ist.

Die Warnung tritt auf, wenn die Kopie die systeminterne Form einer dieser CRT-Funktionen verwendet:

Die Warnung wird auch angezeigt, wenn Sie einen Parameter in einen größeren Datentyp umwandeln und dann eine Kopierzuweisung aus einem lvalue-Verweis erstellen.

Visual C++ generiert diese Warnung möglicherweise für einen Codepfad, der nie ausgeführt wird. Sie können die Warnung mithilfe von #pragma vorübergehend deaktivieren, wie im folgenden Beispiel gezeigt:

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

Dieser Idiom verhindert, dass Visual C++ die Warnung für diesen bestimmten Codeblock generiert. #pragma warning(push) behält den vorhandenen Zustand bei, bevor dieser von #pragma warning(disable: 4789) geändert wird. #pragma warning(pop) stellt den gepushten Zustand wieder her und entfernt die Auswirkungen der #pragma warning(disable:4789). Weitere Informationen zur C++-Präprozessordirektive #pragmafinden Sie unter warning Pragma-Direktiven und dem __Pragma Schlüsselwort.

Die /sdl Compileroption (Zusätzliche Sicherheitsüberprüfungen aktivieren) erhöht diese Warnung auf einen Fehler.

Beispiele

Im folgenden Beispiel wird C4789 generiert.

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

Im folgende Beispiel wird außerdem C4789 generiert.

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