Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
o «identificador» do buffer de tamanho N bytes será excedido; M bytes serão gravados a partir do deslocamento L
Observações
O C4789 avisa sobre saturações de buffer quando funções específicas de tempo de execução C (CRT) são usadas. Ele também pode relatar incompatibilidades de tamanho quando parâmetros são passados ou atribuições são feitas. O aviso é possível se os tamanhos dos dados forem conhecidos em tempo de compilação. Esse aviso é para situações que podem escapar da deteção típica de incompatibilidade de tamanho de dados.
C4789 avisa quando os dados são copiados para um bloco de dados que é conhecido por ser muito pequeno em tempo de compilação.
O aviso ocorre se a cópia usa a forma intrínseca de uma destas funções CRT:
O aviso também aparece quando você converte um parâmetro para um tipo de dados maior e, em seguida, faz uma atribuição de cópia a partir de uma referência lvalue.
Visual C++ pode gerar esse aviso para um caminho de código que nunca é executado. Você pode desativar 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 )
Essa linguagem impede que o Visual C++ gere o aviso para esse bloco específico de código. O #pragma warning(push) preserva o estado existente antes #pragma warning(disable: 4789) de alterá-lo. O #pragma warning(pop) restaura o estado empurrado e remove os efeitos do #pragma warning(disable:4789). Para obter mais informações sobre a diretiva de pré-processador C++ #pragma, consulte warningdiretivas pragma e a palavra-chave __Pragma.
A opção do compilador (Ativar verificações de segurança adicionais) eleva esse aviso a um erro./sdl
Exemplos
O exemplo a seguir gera 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
}