Sdílet prostřednictvím


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

"identifikátor" velikosti N bajtů se přetečí; Bajty M budou zapsány od posunu L

Poznámky

C4789 varuje před přetečením vyrovnávací paměti při použití konkrétních funkcí C runtime (CRT). Může také hlásit neshody velikosti při předání parametrů nebo přiřazení. Upozornění je možné, pokud jsou velikosti dat známé v době kompilace. Toto upozornění platí pro situace, které by mohly odhalit typickou detekci neshody velikosti dat.

C4789 varuje, když se data kopírují do datového bloku, který je v době kompilace příliš malý.

K upozornění dochází v případě, že kopie používá vnitřní formu jedné z těchto funkcí CRT:

Upozornění se zobrazí také při přetypování parametru na větší datový typ a následné vytvoření přiřazení kopie z odkazu lvalue.

Visual C++ může toto upozornění vygenerovat pro cestu kódu, která se nikdy nespustí. Upozornění můžete dočasně zakázat pomocí příkazu #pragma, jak je znázorněno v tomto příkladu:

#pragma warning( push )
#pragma warning( disable : 4789 )
// unused code that generates compiler warning C4789`
#pragma warning( pop )

Tento idiom udržuje Visual C++ vygenerování upozornění pro daný konkrétní blok kódu. Zachová #pragma warning(push) existující stav před #pragma warning(disable: 4789) změnou. Obnoví #pragma warning(pop) stav nabízených změn a odebere účinky #pragma warning(disable:4789). Další informace o direktivě preprocesoru jazyka C++ naleznete v tématu direktivy #pragmaPragma a __Pragma klíčové slovo.warning

Možnost kompilátoru /sdl (Povolit další kontroly zabezpečení) zvýší toto upozornění na chybu.

Příklady

Následující ukázka vygeneruje 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 také generuje 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
}