Advertencia del compilador (nivel 1) C4789

se producirá una saturación del búfer "identifier" con un tamaño de N bytes; se escribirán M bytes empezando en el desplazamiento L

Comentarios

La advertencia C4789 advierte sobre las saturaciones del búfer cuando se usan funciones específicas en tiempo de ejecución de C (CRT). También puede notificar errores de coincidencia de tamaño cuando se pasan parámetros o se realizan asignaciones. La advertencia es posible si los tamaños de datos se conocen en tiempo de compilación. Esta advertencia se usa en situaciones en las que puede eludirse la detección de discrepancias de tamaño de datos.

C4789 advierte cuando se copian datos en un bloque de datos que se sabe que es demasiado pequeño en tiempo de compilación.

La advertencia se produce si la copia usa la forma intrínseca de una de estas funciones de CRT:

La advertencia también aparece al convertir un parámetro en un tipo de datos más grande y, luego, se hace una asignación de copia de una referencia lvalue.

Visual C++ puede generar esta advertencia para una ruta de acceso al código que no se ejecuta nunca. La advertencia se puede deshabilitar temporalmente con #pragma, como se muestra en este ejemplo:

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

Esta expresión impide que Visual C++ genere la advertencia para ese bloque de código específico. #pragma warning(push) conserva el estado antes de que #pragma warning(disable: 4789) lo cambie. #pragma warning(pop) restaura el estado insertado y quita los efectos de la #pragma warning(disable:4789). Para más información sobre la directiva de preprocesador de C++ #pragma, vea warning y Directivas pragma y la palabra clave __Pragma.

La opción del compilador /sdl (Habilitar comprobaciones de seguridad adicionales) eleva esta advertencia a un error.

Ejemplos

El ejemplo siguiente genera el error 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));
}

El ejemplo siguiente también genera el error 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
}