Edit

Share via


Compiler Warning (Level 1) C4789

buffer 'identifier' of size N bytes will be overrun; M bytes will be written starting at offset L

Remarks

C4789 warns about buffer overruns when specific C run-time (CRT) functions are used. It can also report size mismatches when parameters are passed or assignments are made. The warning is possible if the data sizes are known at compile time. This warning is for situations that might elude typical data-size mismatch detection.

C4789 warns when data is copied into a data block that's known to be too small at compile time.

The warning occurs if the copy uses the intrinsic form of one of these CRT functions:

The warning also appears when you cast a parameter to a larger data type, and then make a copy assignment from an lvalue reference.

Visual C++ might generate this warning for a code path that never executes. You can temporarily disable the warning by using #pragma, as shown in this example:

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

This idiom keeps Visual C++ from generating the warning for that specific block of code. The #pragma warning(push) preserves the existing state before #pragma warning(disable: 4789) changes it. The #pragma warning(pop) restores the pushed state, and removes the effects of the #pragma warning(disable:4789). For more information about the C++ preprocessor directive #pragma, see warning and Pragma Directives and the __Pragma Keyword.

The /sdl (Enable Additional Security Checks) compiler option elevates this warning to an error.

Examples

The following sample generates 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));
}

The following sample also generates 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
}