Delen via


Compilerwaarschuwing (niveau 1) C4789

buffer 'identifier' van grootte N bytes zal overschreden worden; M bytes zullen geschreven worden vanaf offset L

Opmerkingen

C4789 waarschuwt voor bufferoverschrijdingen wanneer specifieke C-runtimefuncties (CRT) worden gebruikt. Het kan ook melden wanneer er grootteverschillen zijn bij het doorgeven van parameters of het maken van toewijzingen. De waarschuwing is mogelijk als de gegevensgrootten bekend zijn tijdens het compileren. Deze waarschuwing is bedoeld voor situaties waarin een niet-overeenkomende gegevensgrootte mogelijk onopgemerkt blijft tijdens de gebruikelijke detectie.

C4789 waarschuwt wanneer gegevens worden gekopieerd naar een gegevensblok dat te klein is tijdens het compileren.

De waarschuwing treedt op als de kopie gebruikmaakt van de intrinsieke vorm van een van deze CRT-functies:

De waarschuwing wordt ook weergegeven wanneer u een parameter naar een groter gegevenstype cast en vervolgens een kopietoewijzing maakt van een lvalue-verwijzing.

Visual C++ kan deze waarschuwing genereren voor een codepad dat nooit wordt uitgevoerd. U kunt de waarschuwing tijdelijk uitschakelen met behulp van #pragma, zoals wordt weergegeven in dit voorbeeld:

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

Deze uitdrukking voorkomt dat Visual C++ de waarschuwing voor dat specifieke codeblok genereert. De #pragma warning(push) bestaande status blijft behouden voordat #pragma warning(disable: 4789) deze wordt gewijzigd. Met #pragma warning(pop) herstel je de naar voren geschoven status en verwijder je de effecten van de #pragma warning(disable:4789). Voor meer informatie over de C++-preprocessorrichtlijn #pragma kunt u warning raadplegen en Pragma Directieven en het __Pragma trefwoord.

Met de /sdl compileroptie (Aanvullende beveiligingscontroles inschakelen) wordt deze waarschuwing uitgebreid naar een fout.

Voorbeelden

In het volgende voorbeeld wordt C4789 gegenereerd:

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

In het volgende voorbeeld wordt ook C4789 gegenereerd:

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