Compartir a través de


C6262

Advertencia C6262: La función usa <constante> bytes de la pila: supera /analyze:stacksize<constante 2>.Considere mover algunos datos al montón

Esta advertencia indica que se ha detectado en una función un uso de la pila que supera un umbral preestablecido (constant 2).El tamaño del marco de pila predeterminado para esta advertencia es de 16 kB para el modo usuario y de 1 kB para el modo kernel.La pila está limitada (incluso en modo de usuario) y un error al confirmar una página de la pila provoca una excepción de desbordamiento de pila.El modo kernel tiene un límite de tamaño de pila de 12 kB, que no se puede aumentar; por consiguiente, el código en modo kernel debe restringir activamente el uso de la pila.

Para corregir el problema señalado en esta advertencia, se pueden mover algunos datos al montón o a otra memoria dinámica. En modo usuario, un marco de pila grande puede no ser un problema (y esta advertencia puede suprimirse), pero un marco de pila grande incrementa el riesgo de un desbordamiento de la pila. (Un marco de pila grande puede aparecer si la función usa la pila excesivamente o es recursiva). El tamaño total de la pila en modo usuario se puede incrementar si el desbordamiento de pila ocurre realmente, pero solo hasta el límite del sistema. Se puede usar la opción de línea de comandos /analyze para cambiar el valor de <constant 2>, pero incrementarlo supone el riesgo de que no se notifique un error.

Para el código en modo kernel (por ejemplo, en proyectos del controlador) el valor de <constant 2> se establece en 1 kB.Los controladores bien escritos deben tener muy pocas funciones que se acerquen a este valor y puede que sea conveniente reducir el límite. Las mismas técnicas generales que se usan para que el código de modo usuario reduzca el tamaño de pila pueden adaptarse al código en modo kernel.

Ejemplo

El código siguiente genera esta advertencia porque char buffer asigna 16.382 bytes y la variable de entero local i asigna otros 4 bytes, que sumados superan el límite predeterminado del tamaño de la pila, que es 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...
}

El código siguiente corrige esta advertencia moviendo algunos datos al montón.

// 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);
    }
}

El uso de las opciones malloc y free tiene muchos riesgos en cuanto a pérdidas de memoria y excepciones.Para evitar todos estos tipos de problemas de pérdidas de memoria y excepciones, use los mecanismos proporcionados por la Biblioteca de plantillas estándar (STL) de C++.Estos incluyen shared_ptr, unique_ptr y vector.Para obtener más información, vea Punteros inteligentes (C++ moderno) y Referencia de biblioteca estándar de C++.

Para corregir esta advertencia ajustando el tamaño de pila

  1. En la barra de menús, elija Proyecto, Propiedades.

    Aparece el cuadro de diálogo Páginas de propiedades.

  2. Expanda Propiedades de configuración.

  3. Expanda C/C++.

  4. Seleccione propiedades Línea de comandos.

  5. En Opciones adicionales, agregue /analyze:stacksize16388.

Vea también

Tareas

Cómo: Utilizar comprobaciones nativas en tiempo de ejecución

Referencia

/STACK (Asignaciones de la pila)

_resetstkoflw