Ostrzeżenie kompilatora (poziom 1) C4789
bufor "identyfikator" rozmiaru N bajtów zostanie zastąpiony; Bajty M będą zapisywane począwszy od przesunięcia L
Uwagi
C4789 ostrzega o przekroczeniu buforu, gdy są używane określone funkcje czasu wykonywania języka C (CRT). Może również zgłaszać niezgodności rozmiaru, gdy parametry są przekazywane lub przydziały są wykonywane. Ostrzeżenie jest możliwe, jeśli rozmiary danych są znane w czasie kompilacji. To ostrzeżenie dotyczy sytuacji, w których wykrywanie typowych niezgodności rozmiaru danych może wymykać się.
C4789 ostrzega, gdy dane są kopiowane do bloku danych, który jest znany jako zbyt mały w czasie kompilacji.
Ostrzeżenie występuje, jeśli kopia używa wewnętrznej formy jednej z tych funkcji CRT:
Ostrzeżenie jest również wyświetlane podczas rzutowania parametru do większego typu danych, a następnie przypisania kopii z odwołania lvalue.
Program Visual C++ może wygenerować to ostrzeżenie dla ścieżki kodu, która nigdy nie jest wykonywana. Możesz tymczasowo wyłączyć ostrzeżenie przy użyciu polecenia #pragma
, jak pokazano w tym przykładzie:
#pragma warning( push )
#pragma warning( disable : 4789 )
// unused code that generates compiler warning C4789`
#pragma warning( pop )
Ten idiom uniemożliwia programowi Visual C++ wygenerowanie ostrzeżenia dla tego konkretnego bloku kodu. Element #pragma warning(push)
zachowuje istniejący stan przed #pragma warning(disable: 4789)
jego zmianą. Funkcja #pragma warning(pop)
przywraca stan wypychania i usuwa efekty elementu #pragma warning(disable:4789)
. Aby uzyskać więcej informacji na temat dyrektywy #pragma
preprocesora języka C++, zobacz warning
dyrektywy Pragma i __Pragma
słowo kluczowe.
Opcja kompilatora /sdl
(Włącz dodatkowe kontrole zabezpieczeń) podnosi to ostrzeżenie do błędu.
Przykłady
Poniższy przykład generuje kod 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));
}
Poniższy przykład generuje również kod 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
}