Sdílet prostřednictvím


Upozornění kompilátoru (úroveň 1) C4789

Cíl kopírování paměti je příliš malá.

Upozorňuje vyrovnávací paměti přetečení, pokud jsou použity specifické C Runtime (CRT) funkce, parametry jsou předány a přiřazení jsou prováděny, tak, aby datové formáty jsou známy v době kompilace.Toto upozornění je v situacích, které mohou elude detekce Typická velikost dat neshoda.

Upozornění se zobrazí, pokud data, jejichž délka je známa v kompilace, je zkopírovat a do bloku dat, jejichž velikost je známo v době kompilace pro data příliš malá.Kopie musí provést pomocí jedné z následujících funkcí CRT vnitřní formuláře:

Upozornění se také zobrazí, pokud je datový typ parametru neshoda pomocí přetypování a pak pokus o kopírování přiřazení z odkazu na lvalue.

Visual C++ může generovat upozornění pro kód cestu, která nikdy nespustí.Varování lze dočasně zakázat pomocí #pragma, jak je uvedeno v následujícím příkladu:

#pragma(push)

#pragma warning ( disable : 4789 )

// unused code that generates compiler warning C4789

#pragma(pop)

Tím zachováte Visual C++ z generování upozornění pro tento konkrétní blok kódu.#pragma(push) Zachová stávající stav před #pragma warning(disable: 4789) ji změní.#pragma(pop) Obnoví tlačný státu a odebere účinky #pragma warning(disable:4789).Další informace o direktivě preprocesoru jazyka C++ #pragma, viz upozornění a Direktivy Pragma a klíčové slovo __Pragma.

Příklad

Následující ukázka generuje upozornění 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));
}

Následující ukázka generuje také C4789.

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

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