C6262
Aviso C6262: a função usa bytes de pilha <constantes>: exceeds /analyze:stacksize<constant 2>.Considere mover alguns dados para o heap
Este aviso indica que o uso de pilha que excede o limite predefinido (constant 2) foi detectado em uma função.O tamanho do registro de ativação padrão para esse aviso é 16 KB para o modo de usuário e 1 KB para o modo kernel.A pilha — mesmo no modo de usuário — é limitada, e a falha ao confirmar uma página de pilha causa uma exceção de estouro de pilha.O modo kernel tem um limite de tamanho de pilha de 12 KB, que não pode ser aumentado; portanto, o código do modo kernel deve limitar agressivamente o uso da pilha.
Para corrigir o problema por trás desse aviso, você pode mover alguns dados para o heap ou para outra memória dinâmica. No modo de usuário, um grande quadro de pilha não pode ser a problema e esse aviso pode ser suprimido, mas uma grande moldura de pilha aumenta o risco de um estouro de pilha. (Pode ocorrer um quadro de pilha grande se a função usar a pilha intensamente ou for recursiva.) O tamanho total da pilha no modo de usuário pode ser aumentado se o estouro de pilha ocorrer de fato, mas somente até o limite do sistema. Você pode usar a opção de linha de comando /analyze para alterar o valor de <constant 2>, mas aumentá-lo apresenta um risco de que um erro não será relatado.
Para o código modo kernel, por exemplo, nos projetos de driver, o valor de <constant 2> é definido como 1 KB.Drivers bem escritos devem ter muito poucas funções que aproximam esse valor, e o limite para baixo pode ser desejável. As mesmas técnicas gerais que são usadas para código no modo de usuário a fim de reduzir o tamanho da pilha podem ser adaptadas para o código no modo de kernel.
O código a seguir gera este aviso, pois char buffer aloca 16.382 bytes, e a variável local inteira i aloca outros 4 bytes, que juntos excedem o limite de tamanho da pilha padrão de 16 KB.
// cl.exe /c /analyze /EHsc /W4
#include <windows.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char buffer[MAX_SIZE];
i = 0;
buffer[0]='\0';
// code...
}
O código a seguir corrige esse aviso movendo alguns dados para o heap.
// cl.exe /c /analyze /EHsc /W4
#include <stdlib.h>
#include <malloc.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char *buffer;
i = 0;
buffer = (char *) malloc( MAX_SIZE );
if (buffer != NULL)
{
buffer[0] = '\0';
// code...
free(buffer);
}
}
O uso de malloc e free tem muitas armadilhas em termos de vazamentos de memória e exceções.Para evitar esses tipos de vazamentos e problemas de exceção no geral, use os mecanismos que são fornecidos pela STL (Biblioteca de Modelos Padrão) do C++.Incluem shared_ptr, unique_ptr e vector.Para obter mais informações, consulte Ponteiros inteligentes (C++ moderno) e Referência da Biblioteca Padrão C++.
Para corrigir este aviso ajustando o tamanho da pilha
Na barra de menus, escolha Projeto, Propriedades.
A caixa de diálogo Páginas de Propriedades é exibida.
Expanda as Propriedades de Configuração.
Expanda C/C++.
Selecione as propriedades da Linha de Comando.
Em Opções adicionais, adicione /analyze:stacksize16388.