Compartir a través de


C6262

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

Esta advertencia indica que se ha detectado en una funcion que el uso de la pila supera un umbral preestablecido (constant 2).El tamaño del marco de pila predeterminado para esta advertencia es 16 KB para el modo usuario, 1 KB para el modo kernel.La pila está limitada incluso en modo de usuario y al confirmar una página de la pila un error 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 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 ser suprimida— pero un marco de pila grande incrementa el riesgo de un desbordamiento de pila.(El marco de pila grande puede aparecer si la función usa la pila muy seguidamente o es recursiva.) El tamaño total de la pila en modo usuario se puede aumentar si el desbordamiento de pila ocurre realmente, pero sólo hasta el límite del sistema.Se puede utilizar la opción de línea de comandos /analyze para cambiar el valor de <constant 2>, pero incrementarlo presenta el riesgo de que un error no se notifique.

Para el código en modo kernel —por ejemplo, en el valor de proyectos del controlador de <constant 2> se establece en 1 KB.Los controladores bien escritos deben tener muy pocas funciones que se acerquen a este valor y cambiar el límite hacia abajo puede ser deseable.Las mismas técnicas generales que se utilizan para que el código de modo usuario reduzca el tamaño de pila pueden adaptarse a código en modo kernel.

Ejemplo

El código siguiente genera esta advertencia porque char buffer asigna 16382 bytes y la variable entera local i asigna otros 4 bytes, que sumados superan el límite predeterminado del tamaño de la pila, que es de 16 Kbytes:

#include <windows.h>
#define MAX_SIZE 16382

void f( )
{
  int i;
  char buffer[MAX_SIZE];
  
  i = 0;
  buffer[0]='\0';

  // code...
}

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

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

Para corregir esta advertencia ajustando el tamaño de pila

  1. En la barra de menú 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 de 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