Udostępnij za pośrednictwem


Ostrzeżenie C6262

Funkcja używa constant_1 bajtów stosu: przekracza /analyze:stacksize constant_2. Rozważ przeniesienie danych do sterta

Uwagi

To ostrzeżenie wskazuje, że w funkcji wykryto użycie stosu, które przekracza próg ustawień wstępnych (constant_2). Domyślny rozmiar ramki stosu dla tego ostrzeżenia to 16 KB dla trybu użytkownika, 1 KB dla trybu jądra. Stos — nawet w trybie użytkownika — jest ograniczony, a zatwierdzenie strony stosu powoduje wyjątek przepełnienia stosu. Tryb jądra ma limit rozmiaru stosu o rozmiarze 12 KB, którego nie można zwiększyć. Spróbuj agresywnie ograniczyć użycie stosu w kodzie trybu jądra.

Aby rozwiązać problem związany z tym ostrzeżeniem, możesz przenieść dane do sterta lub do innej pamięci dynamicznej. W trybie użytkownika jedna duża ramka stosu może nie być problemem — to ostrzeżenie może zostać pominięte— ale duża ramka stosu zwiększa ryzyko przepełnienia stosu. (Może wystąpić duża ramka stosu, jeśli funkcja intensywnie używa stosu lub jest rekursywna). Całkowity rozmiar stosu w trybie użytkownika można zwiększyć, jeśli faktycznie występuje przepełnienie stosu, ale tylko do limitu systemu.

W przypadku kodu trybu jądra — na przykład w projektach sterowników — wartość constant_2 jest ustawiona na 1 KB. Dobrze napisane sterowniki powinny mieć kilka funkcji, które podchodzą do tej wartości, a zmiana limitu w dół może być pożądana. Te same ogólne techniki, które są używane w kodzie trybu użytkownika w celu zmniejszenia rozmiaru stosu, można dostosować do kodu trybu jądra.

Nazwa analizy kodu: EXCESSIVESTACKUSAGE

Dostosuj rozmiar stosu, aby pominąć ostrzeżenie

Możesz użyć /analyze:stacksize opcji wiersza polecenia, aby zmienić wartość constant_2, ale zwiększenie powoduje ryzyko, że błąd może nie zostać zgłoszony.

Aby pominąć ostrzeżenie w wierszu polecenia

  • /analyze:stacksize <new-size> Dodaj opcję do wiersza polecenia kompilatora. Użyj wartości większej <new-size> niż constant_1. Jeśli na przykład constant_1 ma wartość 27180, możesz wprowadzić wartość /analyze:stacksize 32768.

Aby pominąć ostrzeżenie w środowisku IDE

  1. W środowisku IDE programu Visual Studio wybierz projekt w oknie Eksplorator rozwiązań.

  2. Na pasku menu wybierz pozycję Właściwości projektu>.

  3. W oknie dialogowym Strony właściwości wybierz stronę właściwości>konfiguracji C/C++>Wiersza polecenia.

  4. W obszarze Dodatkowe opcje dodaj /analyze:stacksize <new-size>, gdzie <new-size> jest większy niż constant_1. Jeśli na przykład constant_1 ma wartość 27180, możesz wprowadzić wartość /analyze:stacksize 32768. Wybierz przycisk OK , aby zapisać zmiany.

Przykład

Poniższy kod generuje to ostrzeżenie, ponieważ char buffer wymaga 16 382 bajtów na stosie, a lokalna zmienna i całkowita wymaga kolejnych 4 bajtów, co razem przekracza domyślny limit rozmiaru stosu 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...
}

Poniższy kod poprawia to ostrzeżenie, przenosząc dane na stertę.

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

Użycie i malloc free ma wiele pułapek, takich jak przecieki pamięci i wyjątki. Aby całkowicie uniknąć tego rodzaju przecieków i problemów z wyjątkami, należy użyć mechanizmów dostarczanych przez standardową bibliotekę C++ (STL). Należą do nich shared_ptr: , unique_ptri vector. Aby uzyskać więcej informacji, zobacz Inteligentne wskaźniki i Standardowa biblioteka języka C++.

Zobacz też

/STACK (Alokacje stosu)
_resetstkoflw
Instrukcje: korzystanie z macierzystego sprawdzania w trakcie wykonywania