Condividi tramite


Avviso del compilatore (livello 1) C4789

destinazione della copia in memoria troppo piccola

Avvisa del sovraccarico del buffer quando vengono utilizzate funzioni del runtime C (CRT), quando vengono passati parametri e quando vengono eseguite assegnazioni, in modo che le dimensioni dei dati siano note in fase di compilazione. Questo avviso è destinato a situazioni in cui il rilevamento della mancata corrispondenza dei dati potrebbe essere eluso.

L'avviso viene visualizzato quando i dati, la cui lunghezza è nota in fase di compilazione, vengono copiati e inseriti in un blocco di dati le cui dimensioni vengono ritenute in fase di compilazione troppo piccole per i dati. La copia deve essere eseguita utilizzando il formato intrinseco di una delle funzioni CRT seguenti:

L'avviso viene inoltre visualizzato quando in seguito a un cast viene a mancare la corrispondenza di un tipo di dati di parametro e viene tentata un'assegnazione di copia da un riferimento lvalue.

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

#pragma(push)

#pragma warning ( disable : 4789 )

// unused code that generates compiler warning C4789

#pragma(pop)

In questo modo non verrà generato alcun avviso per quel blocco di codice specifico. #pragma(push) mantiene lo stato esistente prima che venga cambiato da #pragma warning(disable: 4789). #pragma(pop) ripristina lo stato premuto e rimuove gli effetti di #pragma warning(disable:4789). Per ulteriori informazioni sulla direttiva per il preprocessore C++ #pragma, vedere warning and Direttive pragma e parola chiave __Pragma.

Esempio

Nell'esempio seguente viene generato 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));
}

Nell'esempio seguente viene generato l'errore C4789.

// C4789b.cpp
// compile with: /W1 /O2 /c
// processor: x86
short G;

void main()
{
  int * p = (int *)&G; 
  *p = 3;   // C4789
}