Condividi tramite


C6262

avviso C6262: La funzione utilizza <costante> byte dello stack e supera /analyze:stacksize<costante 2>.Si consiglia di spostare dei dati nell'heap

Questo avviso indica che all'interno di una funzione è stato rilevato un utilizzo dello stack che supera una soglia (constant 2) preimpostata.La dimensione predefinita dello stack frame per questo avviso è 16 KB per la modalità utente, 1 KB per la modalità kernel.Lo stack—anche in modalità utente—è limitato e la mancata riuscita del commit di una pagina provoca un'eccezione di overflow dello stack.La modalità kernel ha un limite della dimensione dello stack di 12 KB, che non può essere aumentato; pertanto, il codice in modalità kernel deve limitare aggressivamente l'utilizzo dello stack.

Per risolvere il problema segnalato da questo avviso, è possibile spostare alcuni dati nella memoria heap o verso l'altra memoria dinamica.In modalità utente, uno stack frame grande può non essere un problema—e questo avviso potrebbe essere eliminato—ma uno stack frame grande aumenta il rischio di overflow dello stack.(Uno stack frame grande può verificarsi se la funzione utilizza molto lo stack o è ricorsiva.) La dimensione totale dello stack in modalità utente può essere aumentata se si verifica un overflow dello stack, ma solo fino al limite di sistema.È possibile utilizzare l'opzione /analyze da riga di comando per modificare il valore <constant 2>, ma aumentandolo introduce un rischio che un errore non venga segnalato.

Per il codice in modalità kernel—ad esempio, in progetti driver—il valore di <constant 2> è impostato a 1 KB.Driver ben scritti dovrebbero avere poche funzioni che si avvicinano a questo valore, e modificare il limite verso il basso può essere opportuno.Le stesse tecniche generali utilizzate per il codice in modalità utente per ridurre la dimensione dello stack possono essere adattate al codice in modalità kernel.

Esempio

Il codice riportato di seguito genera l'avviso perché char buffer alloca 16,382 byte e la variabile locale integer i alloca altri 4 byte, e insieme superano il limite di dimensione dello stack predefinito di 16 KB.

#include <windows.h>
#define MAX_SIZE 16382

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

  // code...
}

Il codice seguente risolve il problema spostando alcuni dati nella memoria heap.

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

Per risolvere il problema regolando la dimensione dello stack

  1. Sulla barra dei menu, scegliere Progetto, Proprietà.

    Verrà visualizzata la finestra di dialogo Pagine delle proprietà.

  2. Espandere Proprietà di configurazione

  3. Espandere C/C++.

  4. Selezionare la proprietà Riga di comando.

  5. In Opzioni aggiuntive, aggiungere /analyze:stacksize16388.

Vedere anche

Attività

Procedura: utilizzare controlli runtime nativi

Riferimenti

/STACK (Allocazioni stack)

_resetstkoflw