Megosztás a következőn keresztül:


Fordító figyelmeztetés (1. szint) C4789

az N bájt méretű puffer "azonosítója" túl lesz futva; M bájtok írása az L eltolástól kezdve

Megjegyzések

A C4789 a puffertúlcsordulásokra figyelmeztet adott C futásidejű (CRT) függvények használatakor. A paraméterek átadásakor vagy a hozzárendelések végrehajtásakor a méreteltéréseket is jelentheti. A figyelmeztetés akkor lehetséges, ha az adatméretek a fordításkor ismertek. Ez a figyelmeztetés olyan helyzetekre vonatkozik, amelyek elkerülhetik az adatméretek eltérésének tipikus észlelését.

A C4789 figyelmeztet, amikor az adatok olyan adatblokkba kerülnek, amelyről ismert, hogy a fordítás időpontjában túl kicsi.

A figyelmeztetés akkor fordul elő, ha a példány ezen CRT-függvények egyikének belső formáját használja.

A figyelmeztetés akkor is megjelenik, ha egy paramétert egy nagyobb adattípushoz ad, majd másolási hozzárendelést hajt ki egy lvalue-hivatkozásból.

A Visual C++ létrehozhatja ezt a figyelmeztetést egy olyan kódútvonal esetén, amely soha nem hajtódik végre. A figyelmeztetést #pragmaideiglenesen letilthatja az alábbi példában látható módon:

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

Ez a kifejezés megakadályozza, hogy a Visual C++ generálja az adott kódblokkra vonatkozó figyelmeztetést. A #pragma warning(push) módosítás előtt #pragma warning(disable: 4789) megőrzi a meglévő állapotot. A #pragma warning(pop) visszaállítja a pusholt állapotot, és eltávolítja a #pragma warning(disable:4789) hatásait. A C++ előfeldolgozási irányelvről #pragmatovábbi információt a warning című témakörben talál__Pragma.

A /sdl (További biztonsági ellenőrzések engedélyezése) fordítóbeállítás a figyelmeztetést hibává emeli át.

Példák

Az alábbi példa c4789-et hoz létre:

// 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));
}

A következő példa c4789-et is létrehoz:

// 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
}