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
}