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 #pragma
finden Sie unter warning
Pragma-Direktiven und dem __Pragma
Schlüsselwort.
Die Compileroption /sdl
(Zusätzliche Sicherheitsüberprüfungen aktivieren) stuft diese Warnung auf einen Fehler hoch.
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
}