Udostępnij za pośrednictwem


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 #pragmapreprocesora 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
}