Aviso C6262
A função usa constant_1 bytes de pilha: excede /analyze:stacksize constant_2. Considere mover alguns dados para o heap
Comentários
Esse aviso indica que o uso da pilha que excede um limite predefinido (constant_2) foi detectado em uma função. O tamanho padrão do registro de ativação para esse aviso é de 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 na confirmação de uma página da 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. Tente limitar agressivamente o uso da pilha no código do modo kernel.
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 quadro de pilha grande pode não ser um problema e esse aviso pode ser suprimido, mas um registro de ativação grande aumenta o risco de um estouro de pilha. (Um registro de ativação grande pode ocorrer se a função usa a pilha fortemente ou é recursiva.) O tamanho total da pilha no modo de usuário poderá ser aumentado se o estouro de pilha realmente ocorrer, mas somente até o limite do sistema.
Para código no modo kernel, por exemplo, em projetos de driver, o valor de constant_2 é definido como 1 KB. Os drivers bem escritos devem ter poucas funções que se aproximam desse valor, e alterar o limite para baixo pode ser desejável. As mesmas técnicas gerais usadas para o código do modo de usuário para reduzir o tamanho da pilha podem ser adaptadas ao código do modo kernel.
Nome da análise de código: EXCESSIVESTACKUSAGE
Ajustar o tamanho da pilha para suprimir o aviso
Você pode usar a opção de linha de comando /analyze:stacksize
para alterar o valor para constant_2, mas o aumento dele introduz um risco de que um erro não seja relatado.
Para suprimir o aviso na linha de comando
- Adicione a opção
/analyze:stacksize <new-size>
à linha de comando do compilador. Use um valor maior que constant_1 para<new-size>
. Por exemplo, se constant_1 for 27180, você poderá inserir/analyze:stacksize 32768
.
Para suprimir o aviso no IDE
No IDE do Visual Studio, selecione o projeto na janela do Gerenciador de Soluções.
Na barra de menus, escolha Projeto>Propriedades.
Na caixa de diálogo Páginas de Propriedades, selecione a página de propriedade Propriedades de Configuração>C/C++>Linha de Comando.
Em Opções adicionais, adicione
/analyze:stacksize <new-size>
, em que<new-size>
é maior que constant_1. Por exemplo, se constant_1 for 27180, você poderá inserir/analyze:stacksize 32768
. Escolha OK para salvar suas alterações.
Exemplo
O código a seguir gera esse aviso porque char buffer
requer 16.382 bytes na pilha e a variável i
de inteiro local requer outros 4 bytes, que juntos excedem o limite de tamanho de 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, como vazamentos de memória e exceções. Para evitar por completo esses tipos de problema envolvendo vazamentos e exceções, use os mecanismos fornecidos pela Biblioteca Padrão do C++ (STL). Elas incluem shared_ptr
, unique_ptr
e vector
. Para obter mais informações, confira Ponteiros inteligentes e Biblioteca Padrão do C++.
Confira também
/STACK
(Alocações de pilha)
_resetstkoflw
Como usar verificações de tempo de execução nativas