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
W środowisku IDE programu Visual Studio wybierz projekt w oknie Eksplorator rozwiązań.
Na pasku menu wybierz pozycję Właściwości projektu>.
W oknie dialogowym Strony właściwości wybierz stronę właściwości>konfiguracji C/C++>Wiersza polecenia.
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_ptr
i 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