Dela via


Kompilatorvarning (nivå 1) C4789

buffert "identifier" med storlek N bytes kommer att överskridas; M bytes kommer att skrivas med början från offset L

Anmärkningar

C4789 varnar för buffertöverskridanden när specifika C-körningsfunktioner (CRT) används. Den kan också rapportera matchningsfel för storlek när parametrar skickas eller tilldelningar görs. Varningen är möjlig om datastorlekarna är kända vid kompileringstillfället. Den här varningen gäller situationer som kan undkomma typisk identifiering av matchningsfel i datastorlek.

C4789 varnar när data kopieras till ett datablock som är känt för att vara för litet vid kompileringstillfället.

Varningen inträffar om kopian använder den inbyggda formen av någon av dessa CRT-funktioner:

Varningen visas också när du omvandlar en parameter till en större datatyp och sedan gör en kopieringstilldelning från en lvalue-referens.

Visual C++ kan generera den här varningen för en kodväg som aldrig körs. Du kan tillfälligt inaktivera varningen med hjälp #pragmaav , som du ser i det här exemplet:

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

Det här formspråket hindrar Visual C++ från att generera varningen för det specifika kodblocket. Bevarar #pragma warning(push) det befintliga tillståndet innan #pragma warning(disable: 4789) det ändras. Återställer #pragma warning(pop) push-tillståndet och tar bort effekterna av #pragma warning(disable:4789). Mer information om C++-förprocessordirektivet #pragmafinns i warningOch Pragma-direktiv och __Pragma Nyckelord.

Kompileringsalternativet (Aktivera ytterligare säkerhetskontroller) höjer varningen till ett fel./sdl

Exempel

I följande exempel genereras 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));
}

I följande exempel genereras även 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
}