Advertencia C6262
La función usa constant_1 bytes de pila: supera /analyze:stacksize constant_2. Considere mover algunos datos al montón
Comentarios
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. Intente limitar agresivamente el uso de la pila en el código del modo kernel.
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. (Es posible que se produzca un marco de pila grande si la función usa mucho la pila o es recursiva). El tamaño total de la pila en modo de usuario se puede aumentar si realmente se produce el desbordamiento de la pila, pero solo hasta el límite del sistema.
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 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.
Nombre del análisis de código: EXCESSIVESTACKUSAGE
Ajuste el tamaño de la pila para suprimir la advertencia
Se puede usar la opción de línea de comandos /analyze:stacksize
para cambiar el valor de constant_2, pero incrementarlo supone el riesgo de que no se notifique un error.
Supresión de la advertencia en la línea de comandos
- Agregue la opción
/analyze:stacksize <new-size>
a la línea de comandos del compilador. Use un valor para<new-size>
que sea mayor que constant_1. Por ejemplo, si constant_1 es 27180, se puede escribir/analyze:stacksize 32768
.
Supresión de la advertencia en el IDE
En el IDE de Visual Studio, seleccione el proyecto en la ventana Explorador de soluciones.
En la barra de menús, seleccione Proyecto>Propiedades.
En el cuadro de diálogo Páginas de propiedades, seleccione la página Propiedades de configuración>C/C++>Línea de comandos.
En Opciones adicionales, agregue
/analyze:stacksize <new-size>
, donde<new-size>
es mayor que constant_1. Por ejemplo, si constant_1 es 27180, se puede escribir/analyze:stacksize 32768
. Elija Aceptar para guardar los cambios.
Ejemplo
El código siguiente genera esta advertencia porque char buffer
requiere 16.382 bytes en la pila y la variable de entero local i
requiere 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 malloc
y free
tiene muchas dificultades, como pérdidas de memoria y excepciones. Para evitar estos problemas, se recomienda usar los mecanismos que proporciona la biblioteca estándar de C++ (STL). Estas incluyen shared_ptr
, unique_ptr
y vector
. Para más información, consulte los artículos sobre punteros inteligentes y biblioteca estándar de C++.
Consulte también
/STACK
(Asignaciones de la pila)
_resetstkoflw
Cómo: usar comprobaciones nativas en tiempo de ejecución