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


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

конечная область для копирования памяти слишком мала

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

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

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

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

#pragma(push)

#pragma warning ( disable : 4789 )

// unused code that generates compiler warning C4789

#pragma(pop)

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

Пример

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

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