Partilhar via


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

  1. No IDE do Visual Studio, selecione o projeto na janela do Gerenciador de Soluções.

  2. Na barra de menus, escolha Projeto>Propriedades.

  3. Na caixa de diálogo Páginas de Propriedades, selecione a página de propriedade Propriedades de Configuração>C/C++>Linha de Comando.

  4. 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