Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
}