Partilhar via


Aviso do compilador (nível 1) C4789

o buffer 'identifier' de tamanho N bytes será saturado; Os bytes M serão gravados a partir do deslocamento L

Comentários

O C4789 alerta sobre saturações de buffer quando funções específicas de CRT (tempo de execução C) são usadas. Ele também pode relatar incompatibilidades de tamanho quando os parâmetros são passados ou as atribuições são feitas. O aviso será possível se os tamanhos de dados forem conhecidos no momento da compilação. Esse aviso é para situações que podem escapar à detecção de incompatibilidade típica de tamanho de dados.

O C4789 avisa quando os dados são copiados em um bloco de dados conhecido por ser muito pequeno no momento da compilação.

O aviso ocorrerá se a cópia usar a forma intrínseca de uma destas funções CRT:

O aviso também aparece quando você converte um parâmetro em um tipo de dados maior e, em seguida, faz uma atribuição de cópia de uma referência lvalue.

O Visual C++ pode gerar esse aviso para um caminho de código que nunca é executado. Você pode desabilitar temporariamente o aviso usando #pragma, conforme mostrado neste exemplo:

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

Esse idioma impede que o Visual C++ gere o aviso para esse bloco de código específico. O #pragma warning(push) preserva o estado existente antes de #pragma warning(disable: 4789) alterá-lo. O #pragma warning(pop) restaura o estado enviado por push e remove os efeitos do #pragma warning(disable:4789). Para obter mais informações sobre a diretiva de pré-processador C++ #pragma, confira warning e Diretivas pragma e a __Pragmapalavra-chave.

A opção do compilador /sdl (Habilitar Verificações de Segurança Adicionais) eleva esse aviso a um erro.

Exemplos

O exemplo a seguir gera o aviso 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));
}

O exemplo a seguir também gera 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
}