Freigeben über


Compilerwarnung (Stufe 1) C4789

Das Ziel für die Speicherkopie ist zu klein.

Warnt vor einem Pufferüberlauf, wenn bestimmte Funktionen der C Runtime (CRT) verwendet, Parameter übergeben und Zuweisungen ausgeführt werden, bei denen die Datengrößen zur Kompilierzeit bekannt ist. Diese Warnung dient für Situationen, in denen die Erkennung von Datengrößenkonflikten umgangen werden könnte.

Die Warnung wird angezeigt, wenn Daten, deren Länge zur Kompilierzeit bekannt ist, kopiert und in einen Datenblock eingefügt werden, dessen Größe zur Kompilierzeit bekannt und für die Daten zu klein ist. Der Kopiervorgang muss mit der systeminternen Form einer der folgenden CRT-Funktionen ausgeführt werden:

Die Warnung wird auch angezeigt, wenn ein Parameterdatentyp durch eine Umwandlung falsch zugeordnet und anschließend eine Kopierzuweisung über einen lvalue-Verweis vorgenommen wird.

Visual C++ kann diese Warnung für einen Codepfad generieren, der nicht ausgeführt wird. Sie können die Warnung vorübergehend deaktivieren, indem Sie #pragma wie im folgenden Beispiel gezeigt verwenden:

#pragma(push)

#pragma warning ( disable : 4789 )

// unused code that generates compiler warning C4789

#pragma(pop)

Dadurch wird verhindert, dass Visual C++ die Warnung für diesen Codeblock generiert. Durch #pragma(push) wird der vorhandene Zustand beibehalten, bevor er von #pragma warning(disable: 4789) geändert wird. Durch #pragma(pop) wird der gedrückte Zustand wiederhergestellt und die Auswirkungen von #pragma warning(disable:4789) werden entfernt. Weitere Informationen zur C++-Präprozessordirektive #pragma finden Sie unter warning und Pragma-Direktiven und das __Pragma-Schlüsselwort.

Beispiel

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 folgenden Beispiel wird außerdem C4789 generiert.

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

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