Condividi tramite


Avviso C6262

La funzione usa constant_1 byte di stack: supera /analyze:stacksize constant_2. Prendere in considerazione lo spostamento di alcuni dati nell'heap

Osservazioni:

Questo avviso indica che l'utilizzo dello stack che supera una soglia predefinita (constant_2) è stato rilevato in una funzione. La dimensione predefinita dello stack frame per questo avviso è di 16 KB per la modalità utente, 1 KB per la modalità kernel. Lo stack, anche in modalità utente, è limitato e il commit di una pagina dello stack causa un'eccezione di overflow dello stack. La modalità kernel ha un limite di dimensioni dello stack di 12 KB, che non può essere aumentato. Provare a limitare in modo aggressivo l'uso dello stack nel codice in modalità kernel.

Per correggere il problema dietro questo avviso, è possibile spostare alcuni dati nell'heap o in un'altra memoria dinamica. In modalità utente, uno stack frame di grandi dimensioni potrebbe non essere un problema e questo avviso potrebbe essere eliminato, ma un frame di stack di grandi dimensioni aumenta il rischio di un overflow dello stack. Un frame dello stack di grandi dimensioni può verificarsi se la funzione usa pesantemente lo stack o è ricorsivo. Le dimensioni totali dello stack in modalità utente possono essere aumentate se si verifica effettivamente l'overflow dello stack, ma solo fino al limite di sistema.

Per il codice in modalità kernel, ad esempio nei progetti driver, il valore di constant_2 è impostato su 1 KB. I driver ben scritti devono avere poche funzioni che si avvicinano a questo valore e la modifica del limite verso il basso potrebbe essere auspicabile. Le stesse tecniche generali usate per il codice in modalità utente per ridurre le dimensioni dello stack possono essere adattate al codice in modalità kernel.

Nome dell'analisi del codice: EXCESSIVESTACKUSAGE

Modificare le dimensioni dello stack per eliminare l'avviso

È possibile usare l'opzione della /analyze:stacksize riga di comando per modificare il valore per constant_2, ma l'aumento introduce un rischio che un errore non venga segnalato.

Per eliminare l'avviso nella riga di comando

  • Aggiungere l'opzione /analyze:stacksize <new-size> alla riga di comando del compilatore. Usare un valore per <new-size> maggiore di constant_1. Ad esempio, se constant_1 è 27180, è possibile immettere /analyze:stacksize 32768.

Per eliminare l'avviso nell'IDE

  1. Nell'IDE di Visual Studio selezionare il progetto nella finestra Esplora soluzioni.

  2. Sulla barra dei menu scegliere Progetto>Proprietà.

  3. Nella finestra di dialogo Pagine delle proprietà selezionare la pagina delle proprietà Proprietà>di configurazione C/C++>Riga di comando.

  4. In Opzioni aggiuntive aggiungere /analyze:stacksize <new-size>, dove <new-size> è maggiore di constant_1. Ad esempio, se constant_1 è 27180, è possibile immettere /analyze:stacksize 32768. Scegli OK per salvare le modifiche.

Esempio

Il codice seguente genera questo avviso perché char buffer richiede 16.382 byte nello stack e la variabile i integer locale richiede altri 4 byte, che insieme superano il limite di dimensioni dello stack predefinito di 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...
}

Il codice seguente corregge questo avviso spostando alcuni dati nell'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);
    }
}

L'uso di malloc e free ha molte insidie, ad esempio perdite di memoria ed eccezioni. Per evitare completamente questi tipi di perdite ed eccezioni, usare i meccanismi forniti dalla libreria standard C++ (STL). Questi includono shared_ptr, unique_ptre vector. Per altre informazioni, vedere Puntatori intelligenti e libreria standard C++.

Vedi anche

/STACK (Allocazioni stack)
_resetstkoflw
Procedura: Usare controlli di runtime nativi