Condividi tramite


Avviso del compilatore (livello 1) C4789

buffer 'identifier' delle dimensioni N byte verrà sovraccaricato; I byte M verranno scritti a partire dall'offset L

Osservazioni:

C4789 avvisa i sovraccarichi del buffer quando vengono usate funzioni C di runtime (CRT) specifiche. Può anche segnalare mancate corrispondenze delle dimensioni quando vengono passati parametri o assegnazioni. L'avviso è possibile se le dimensioni dei dati sono note in fase di compilazione. Questo avviso è relativo alle situazioni in cui potrebbe essere eluso il normale rilevamento di dimensioni non corrispondenti dei dati.

C4789 avvisa quando i dati vengono copiati in un blocco di dati noto per essere troppo piccolo in fase di compilazione.

L'avviso si verifica se la copia usa il formato intrinseco di una di queste funzioni CRT:

L'avviso viene visualizzato anche quando si esegue il cast di un parametro a un tipo di dati più grande e quindi si effettua un'assegnazione di copia da un riferimento lvalue.

Visual C++ potrebbe generare questo avviso per un percorso di codice che non viene mai eseguito. È possibile disabilitare temporaneamente l'avviso usando #pragma, come mostrato in questo esempio:

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

Questo linguaggio impedisce a Visual C++ di generare l'avviso per quel blocco di codice specifico. #pragma warning(push) mantiene lo stato esistente prima che #pragma warning(disable: 4789) lo modifichi. #pragma warning(pop) ripristina lo stato di cui è stato eseguito il push ed elimina gli effetti di #pragma warning(disable:4789). Per altre informazioni sulla direttiva #pragmadel preprocessore C++, vedere warning Direttive Pragma e parola __Pragma chiave .

L'opzione del /sdl compilatore (Abilita controlli di sicurezza aggiuntivi) eleva questo avviso a un errore.

Esempi

L'esempio seguente genera l'errore 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));
}

Anche l'esempio seguente genera l'errore 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
}