Поделиться через


Предупреждение компилятора (уровень 1) C4789

буфер "идентификатор" размера N байт будет перезаверщен; Байты M будут записаны начиная с смещения L

Замечания

C4789 предупреждает о переполнении буфера при использовании определенных функций времени выполнения C (CRT). Он также может сообщать о несоответствии размера при передаче параметров или назначений. Предупреждение возможно, если размеры данных известны во время компиляции. Это предупреждение предназначено для ситуаций, в которых типичные несоответствия размеров данных могут остаться незамеченными.

C4789 предупреждает, когда данные копируются в блок данных, который, как известно, слишком мал во время компиляции.

Предупреждение возникает, если копия использует встроенную форму одной из следующих функций CRT:

Предупреждение также отображается при приведение параметра к большему типу данных, а затем делается назначение копирования из ссылки lvalue.

Visual C++ может создать это предупреждение для пути кода, который никогда не выполняется. Предупреждение можно временно отключить с помощью #pragma, как показано в следующем примере:

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

Этот идиом позволяет Visual C++ создавать предупреждение для этого конкретного блока кода. #pragma warning(push) сохраняет существующее состояние перед тем, как #pragma warning(disable: 4789) изменяет его. #pragma warning(pop) восстанавливает отмененное состояние и устраняет последствия #pragma warning(disable:4789). Дополнительные сведения о директиве #pragmaпрепроцессора C++ смwarning. в директивах Pragma и ключевом слове__Pragma.

Параметр /sdl компилятора (включение дополнительных проверок безопасности) повышает этот предупреждение до ошибки.

Примеры

Следующий пример приводит к возникновению ошибки 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));
}

Следующий пример приводит к возникновению ошибки 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
}